我有一个HashSet<Double>
,我想从中提取整数元素,即小数后全为零的元素。有标准的方法吗?我可以做一些迂回的事情,例如:给定一个双x
,我可以查看小数点后的所有值,看看它们是否都为零,但这似乎很复杂。
您可以将它们强制转换为整数,并将强制转换的值与原始相等
double d = 1.5;
if((int)d==d) // integer
else // not integer
我想你喜欢整数的最终结果,而不是双的结果。例如,7而不是7.0。
所以试试这个:
Set<Double> set = new HashSet<>();
set.add(6.4);
set.add(10.44);
set.add(7.0);
Set<Integer> filtered = set.stream()
.filter(item -> Math.floor(item) == item)
.map(Double::intValue)
.collect(Collectors.toSet());
System.out.println(filtered);
您可以这样做:
HashSet<Double> hd = new HashSet<> ();
hd.add (3.5);
hd.add (2.0);
hd.add (3.444);
hd.add (-1.0);
Set<Double> filtered = hd.stream()
.filter (x -> (int)(double)x == x)
.collect (Collectors.toSet());
System.out.println (filtered);
输出:
[2.0, -1.0]
首先必须将Double
强制转换为double
,然后再将其强制转换为int
。如果该int
等于原始Double
,则该Double
保持整数值。
如果你想避免显式铸造,你可以更改
.filter (x -> (int)(double)x == x)
至
.filter (x -> x.intValue() == x)
它做了完全相同的事情。
试试这个:
Collection<Integer> filterIntegers( final HashSet<Double> doubles )
{
final var retValue = doubles.stream()
.filter( d -> d.doubleValue() == d.intValue() )
.map( Double::intValue )
.collect( Collector.toSet() );
return retValue;
}
在我看来,明确比较d
的实(双(值及其整数值似乎是该需求的最精确实现。不需要转换,不需要数学运算(尽管所有这些都会提供相同的结果!(。