一些Collectors 类的看起来好像常用的静态工厂方法。
来几个常用的 比如:list转map、分组、filter、求和、最大&&最小值
首先 造假 弄一些伪数据
创建一个 Animal类
public class Animal { private Integer id; private String name; private String superpowers; private BigDecimal weight; public Animal(Integer id, String name, String superpowers,BigDecimal weight) { this.id = id; this.name = name; this.superpowers = superpowers; this.weight = weight; } }main方法:
public static void main(String[] args) { var animals = Arrays.asList(new Animal(1, "大西机", "特能吃",new BigDecimal("71.20")) , new Animal(1, "大脑斧", "牙口好",new BigDecimal("60.24")) , new Animal(3, "发福蝶", "发福了",new BigDecimal("0.02")) , new Animal(4, "小海疼", "可爱",new BigDecimal("120.00"))); }问题来了:list如何转map?
//如果key重复了,根据(k1, k2) -> k1 保留第一个重复的key (k1, k2) -> k2 是保留后面的 Map<Integer, Animal> map = animals .stream() .collect(Collectors.toMap(Animal::getId, a -> a, (k1, k2) -> k1)); map.forEach((k, v) -> { System.out.println(k + "--" + v.getName()); });这就可以了。
问题来了:如何分组?
Map<Integer, List<Animal>> mapGroup = animals .stream() .collect(Collectors.groupingBy(Animal::getId)); mapGroup.forEach((k, v) -> { System.out.println("---------"); v.forEach(o -> { System.out.println(k + "--" + o.getName() + "--" + o.getSuperpowers()); }); System.out.println("---------"); });这就可以了。
问题来了:filter怎么用?
//filter List<Animal> listFilter = animals .stream() .filter(a -> a.getName().equals("小海疼") || a.getName().equals("发福蝶")) .collect(Collectors.toList()); listFilter.forEach(animal -> System.out.println(animal.getName() + "--" + animal.getSuperpowers()));这就可以了。
问题来了:求和?
BigDecimal animalsWeight = animals .stream() .map(Animal::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println(animalsWeight);这就可以了。
问题来了:最大值&&最小值?
var max = animals .stream() .collect(Collectors.maxBy(Comparator.comparing(Animal::getId))); System.out.println(max.get().getName()); var min = animals .stream() .collect(Collectors.minBy(Comparator.comparing(Animal::getId))); System.out.println(min.get().getName());这就可以了。
