我想通过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表达式怎么可能?
答案 0 :(得分:7)
您可以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
编辑:如果您希望在修改后找到ObjectTest
最大值为operation(obj.getA(), obj.getB())
的实例,则可以使用Stream
&#39; s {{1} }:
max(Comparator<? super T> comparator)
答案 1 :(得分:0)
@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);
以获得最大结果。