2016-08-25 53 views
0

我想采取List<Pojo>到其他List<Pojo>
输入数据如下所示:JDK8拉姆达过滤器,以其他列表

Pojo -> type:A money:20.00 
Pojo -> type:A money:10.00 
Pojo -> type:B money:23.00 
Pojo -> type:A money:11.00 
Pojo -> type:C money:38.00 
Pojo -> type:B money:233.00 

和输出数据,如以下三(每种类型最大的钱):

Pojo -> type:A money:20.00 
Pojo -> type:B money:233.00 
Pojo -> type:C money:38.00 

那么,我如何使用lambda来做这项工作?
感谢提前!

回答

3

下面是使用最多的方法,通过

public class Test4 { 
    public static void main(String[] args) { 
     List<Pojo> pojoList = new ArrayList<>(); 
     pojoList.add(new Pojo("A", 20.00d)); 
     pojoList.add(new Pojo("A", 10.00d)); 
     pojoList.add(new Pojo("B", 23.00d)); 
     pojoList.add(new Pojo("A", 11.00d)); 
     pojoList.add(new Pojo("C", 38.00d)); 
     pojoList.add(new Pojo("B", 233.00d)); 
     Map<String, Optional<Pojo>> map = pojoList.stream() 
       .collect(Collectors.groupingBy(Pojo::getType, Collectors.maxBy(Comparator.comparing(Pojo::getMoney)))); 
     List<Pojo> pojos = map.values().stream().map(Optional::get).collect(Collectors.toList()); 
     System.out.println(pojos); 

    } 

    static class Pojo { 
     public String type; 
     public double money; 

     public Pojo(String type, double money) { 
      this.type = type; 
      this.money = money; 
     } 

     public double getMoney() { 
      return money; 
     } 

     public String getType() { 
      return type; 
     } 

     @Override 
     public String toString() { 
      return "Pojo [type=" + type + ", money=" + money + "]"; 
     } 

    } 
} 

输出

[Pojo [type=A, money=20.0], Pojo [type=B, money=233.0], Pojo [type=C, money=38.0]] 

UPDATE

还有就是Collectors.collectingAndThen可以用来对结果应用功能,以获得通过Optional

进口

import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.collectingAndThen; 
import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.maxBy; 

包裹collectingAndThen

Map<String, Pojo> result = pojoList.stream() 
     .collect(groupingBy(Pojo::getType, collectingAndThen(maxBy(comparing(Pojo::getMoney)), Optional::get))); 

输出

{A=Pojo [type=A, money=20.0], B=Pojo [type=B, money=233.0], C=Pojo [type=C, money=38.0]} 
0

猜猜这是接近你所需要的:

Money money1 = new Money("A", 100); 
    Money money2 = new Money("A", 200); 
    Money money3 = new Money("B", 300); 
    Money money4 = new Money("C", 400); 
    Money money5 = new Money("A", 500); 
    Money money6 = new Money("B", 600); 
    Money money7 = new Money("A", 700); 

    List<Money> moneys = new ArrayList<Money>(); 

    moneys.add(money1); 
    moneys.add(money2); 
    moneys.add(money3); 
    moneys.add(money4); 
    moneys.add(money5); 
    moneys.add(money6); 
    moneys.add(money7); 

    List<Money> maxList = new ArrayList<Money>(); 

    moneys.stream() 
      .collect(
        Collectors.groupingBy(Money::getType, Collectors.maxBy(Comparator.comparing(Money::getAmount)))) 
      .forEach((type, sumOfType) -> System.out.println(type + "\t" + sumOfType)); 

    moneys.stream().collect(Collectors.groupingBy(Money::getType, Collectors.maxBy(Comparator.comparing(Money::getAmount)))) 
      .forEach((type, max) -> maxList.add(max.get())); 

    maxList.forEach(System.out::println);