利用 java8 新特性, 可以用简洁高效的代码来实现一些数据处理.
定义 1 个 Apple 对象:
- public class Apple {
- private Integer id;
- private String name;
- private BigDecimal money;
- private Integer num;
- public Apple(Integer id, String name, BigDecimal money, Integer num) {
- this.id = id;
- this.name = name;
- this.money = money;
- this.num = num;
- }
- }
添加一些测试数据:
- Apple apple1 = new Apple(1,"苹果 1",new BigDecimal("3.25"),10);
- Apple apple2 = new Apple(1,"苹果 2",new BigDecimal("1.35"),20);
- Apple apple3 = new Apple(2,"香蕉",new BigDecimal("2.89"),30);
- Apple apple4 = new Apple(3,"荔枝",new BigDecimal("9.99"),40);
- List<Apple> appleList = Lists.newArrayList(apple1, apple2, apple3, apple4);
1, 分组
List 里面的对象元素, 以某个属性来分组, 例如, 以 id 分组, 将 id 相同的放在一起:
- //List 以 ID 分组 Map<Integer,List<Apple>>
- Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
2,List 转 Map
id 为 key,apple 对象为 value, 可以这么做:
- /**
- * List -> Map
- * 需要注意的是:
- * toMap 如果集合对象有重复的 key, 会报错 Duplicate key ....
- * apple1,apple12 的 id 都为 1.
- * 可以用 (k1,k2)->k1 来设置, 如果有重复的 key, 则保留 key1, 舍弃 key2
- */
- Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
3, 过滤 Filter
从集合中过滤出来符合条件的元素:
- // 过滤出符合条件的数据
- List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());
4. 求和
将集合中的数据按照某个属性求和:
- // 计算 总金额
- BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
5. 查找流中最大 最小值
Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值.
- Optional<Dish> maxDish = Dish.menu.stream().
- collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));
- maxDish.ifPresent(System.out::println);
- Optional<Dish> minDish = Dish.menu.stream().
- collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
- minDish.ifPresent(System.out::println);
6. 去重
- // 根据 id 去重
- List<Person> unique = appleList.stream().collect(
- collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(Apple::getId))), ArrayList::new)
- );
参考: https://blog.csdn.net/lu930124/article/details/77595585
来源: http://www.bubuko.com/infodetail-2646307.html