java8总是感觉很有用,并且可以常用的Stream还记不住的一些操作

tech2026-03-27  0

一些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());

这就可以了。

 

 

 

 

 

最新回复(0)