a='hello world'
map(lambda x:x, a)
leastIdx应该返回4,但我无法编译。 任何见解都表示赞赏。
final int[] brr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
for (int i : brr) {
System.out.println(Math.sin(i));
}
final int leastIdx = Arrays.stream(brr).min(Comparator.comparingDouble(i -> Math.sin(i))).get();
答案 0 :(得分:4)
IntStream#min
没有拿比较器;它只是在流中找到最小的int
。您必须转换为Stream<Integer>
:
Arrays.stream(brr).boxed()
.min(comparingDouble(i -> Math.sin(i)))
.get();
或使用reduce
计算分钟:
Arrays.stream(brr)
.reduce((x,y) -> Math.sin(x) > Math.sin(y) ? y : x )
.getAsInt();
leastIdx应该返回为4
您的信息流实际上是在尝试查找int
最小的Math.sin
,而不是int
的索引。如果要查找索引,则需要流式传输索引而不是值:
int leastIdx = IntStream.range(0, brr.length).boxed()
.min(comparingDouble(i->Math.sin(brr[i])))
.get();
或者,如果你愿意牺牲清晰度来避免拳击:
int leastIdx = IntStream.range(0, brr.length)
.reduce((x,y) -> Math.sin(brr[x]) > Math.sin(brr[y]) ? y : x)
.getAsInt();
答案 1 :(得分:2)
建议的解决方案有一个缺陷:他们几乎每个元素都计算两次正弦值。因此,对于1000个输入元素,您将需要计算约2000次正弦值。
我的StreamEx库有两个解决方案,每个流元素只计算一次正弦值:
itertools
或者:
final int leastIdx = IntStreamEx
.ofIndices(brr).boxed()
.minByDouble(i -> Math.sin(brr[i])).get();
两者都在您的输入上返回4。不幸的是,他们目前都涉及拳击。目前,StreamEx没有提供消除装箱和两次正弦计算的方法。