如何在Java中用lambda和stream替换for循环?

时间:2016-04-29 08:42:56

标签: java lambda

如何将以下for循环转换为使用带流的Java lambda?

List<Fruit> fruits = createFruitArrayList (); // creates a list of fruits
Fruit largeApple = null;    // holds the largest apple so far for  
for (Fruit fruit : fruits) { 
  if (fruit.getType () == “Apple”) { 
    if (largeApple == null ||
     largeApple.size () < fruit.size ()) {
      largeApple = fruit;
    }
  }
}

3 个答案:

答案 0 :(得分:1)

您可以使用comparator来比较两个值

Comparator<Fruit> comp = (fruit1, fruit2) -> Integer.compare( fruit1.size(), fruit2.size());
Fruit largeApple = fruits.stream().max(comp).get();

另外,比较字符串的方式是错误的

if (fruit.getType () == “Apple”)

你想要的是什么

if (fruit.getType().equals("Apple"))

有关详细信息,请查看以下问题: How do I compare strings in Java?

答案 1 :(得分:1)

危险,威尔罗宾逊!不要使用==来比较字符串!使用equals()

那就是说,这段代码等同于你的循环:

Fruit largestApple = fruits.stream()
  .filter(f -> f.getType().equals("Apple"))
  .max(Comparator.comparing(Fruit::size))
  .orElse(null);

请注意使用方法引用(而不是lambda)作为传递给comparing()的参数。

答案 2 :(得分:0)

这看起来很有效:

form

BTW:您的示例代码非常糟糕 - 请在真正的语法正确的java中发布工作示例。