java8 函数式编程常用方法

2020-07-30   14 次阅读


java8 函数编程

函数式编程是 java8 引入的新特性,很多文章都介绍过这个东西,本文则是记录一些本人开发中经常用到的一些方法。

#stream 基本操作

//从一个列表里筛选比较重的苹果。 顺序处理:
List<Apple> heavyApples = inventory.stream().filter((Apple a) -> a.getWeight() > 150).collect(toList());

//list中实体类根据月份升序排序,自动重构原来的list
monthList.sort(Comparator.comparing(CmEasyUiTree::getMonth));

//从列表中返回一个属性为list
reports.stream().map(TaskReport::getOrganizationName).collect(Collectors.toList())

list.stream().mapToDouble(User::getHeight).sum()//和
list.stream().mapToDouble(User::getHeight).max()//最大
list.stream().mapToDouble(User::getHeight).min()//最小
list.stream().mapToDouble(User::getHeight).average()//平均值

#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));

#分组

将 List 里面的对象元素,以某个属性来分组,例如,以 id 分组,将 id 相同的放在一起:

//List 以 ID 分组 Map<Integer,List<Apple>>
Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));

#过滤 filter

从集合中过滤出来符合条件的元素(map 只是覆盖属性,filter 根据判断属性来 collect 宿主 bean):

//过滤出符合条件的数据
List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());

#求和

将集合中的数据按照某个属性求和:

BigDecimal:
//计算 总金额
BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
System.err.println("totalMoney:"+totalMoney); //totalMoney:17.48

Integer:
//计算 数量
int sum = appleList.stream().mapToInt(Apple::getNum).sum();
System.err.println("sum:"+sum); //sum:100

List<Integer> cc = new ArrayList<>();
cc.add(1);cc.add(2);cc.add(3);
int sum = cc.stream().mapToInt(Integer::intValue).sum();//6

#stream 常用操作

//分割字符串为List
List<String> dateList = Lists.newArrayList(Splitter.on(",").omitEmptyStrings().trimResults().split(dateListStr)) ;
[2019-03, 2019-06, 2019-09, 2019-12]

// 根据 id 去重
List<TaskReport> reports = reportList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TaskReport::getTaskId))), ArrayList::new));

//筛选 List 数据,再修改每个对象中的值
List<TaskReport> reports = reports.stream()
.filter(r -> checkDate(r.getPrgDateList(),report.getPendingTask()))
.peek(v -> v.setPrgDateList(report.getPendingTask())).collect(Collectors.toList());

// 筛选出最大的一个对象
TaskWorkReport t = val.stream().max(Comparator.comparing(TaskWorkReport::getAuditTaskSdu)).get();

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

一介死肥宅程序员,希望世界和平