我想用java8的lambda表达式重写下面的for-loop-语句。
public class Test {
List<ObjectTest> lst;
public int operation(int a, int b) {
return a * b;
}
int max = 0;
ObjectTest suitableObj = null;
for(ObjectTest obj:lst) {
int result = operation(obj.getA(), obj.getB());
if(result > max) {
suitableObj = obj;
max = result;
}
}
}
lambda表达式是如何实现的呢?
发布于 2018-06-04 17:06:22
您可以Stream
您的ObjectTest
元素,将它们映射到一个IntStream
,并调用max()
方法来计算最大值:
int max = lst.stream()
.mapToInt(obj->operation(obj.getA(), obj.getB()))
.max()
.orElse(0); // default value in case the input List is empty
编辑:如果您希望在编辑后找到最大值为operation(obj.getA(), obj.getB())
的ObjectTest
实例,则可以使用Stream
的max(Comparator<? super T> comparator)
ObjectTest max = lst.stream()
.max(Comparator.comparingInt(obj->operation(obj.getA(), obj.getB())))
.orElse(null);
发布于 2018-10-13 03:14:49
@Eran的答案是最简洁的,但你应该考虑写一个重载的方法:
public int operation(ObjectTest o) {
return o.getA() * o.getB();
}
然后你可以简单地写下:
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.maxBy;
list.stream().max(comparing(Test::operation)).orElse(null);
获取操作产生最大结果的对象,以及
list.stream().maToInt(comparing(Test::operation)).max().orElse(0);
以获得最大的结果。
https://stackoverflow.com/questions/50676927
复制相似问题