JDK1.8新特性
lambda表达式
创建匿名内部类
// 1.8前创建匿名内部类
Converter<String ,Integer> converter = new Converter<String, Integer>() {
@Override
public Integer converter(String s) {
return Integer.parseInt(s);
}
};
// 1.8后创建匿名内部类方法1
Converter<String ,Integer> converter = (f) -> {
return Integer.valueOf(f);
};
// 1.8后创建匿名内部类方法2
Converter<String ,Integer> converter = (f) -> Integer.parseInt(f);
lambda和stream结合:过滤
public static void main(String[] args) {
// lambda与Stream结合使用
// 创建Stream对象
Stream<String> stream = Stream.of("aaa","bbb","ccc");
// 列表转Stream对象
ArrayList<String> array = new ArrayList<String>();
array.add("a");
array.add("b");
array.add("c");
// 使用lambda表达式过滤出以"a"开头的流
stream.filter((s) -> s.startsWith("a")).forEach(s -> System.out.println(s)); // 打印aaa
array.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s)); // 打印a
}
lambda和stream结合:过滤+统计
public static void main(String[] args) {
// lambda与Stream结合使用
// 创建Stream对象
Stream<String> stream = Stream.of("aaa","bbb","ccc");
// 使用lambda表达式过滤出以"a"开头的流,并统计出过滤后的元素个数
long count = stream.filter(s -> s.startsWith("a")).count();
System.out.println(count); // 打印1
}
lambda双冒号的使用
public static void main(String[] args) {
// lambda与Stream结合使用
// 创建Stream对象
Stream<String> stream = Stream.of("aaa","bbb","ccc");
// 双冒号的使用:将方法作为一个参数传入到stream内部,使stream里面的每一个参数都在该方法中执行一次
stream.forEach(TestClass::printStr); // 打印aaa bbb ccc
}
public static void printStr(String str) {
System.out.print(str + " ");
}
lambda map和stream.forEach 区别
map 方法的用途是将旧数据转换后变为新数据,是一种 1:1 的映射,每个输入元素按照规则转换成另一个元素。该方法是 Intermediate 操作
Stream<String> stream = Stream.of("a", "b", "c", "d");
stream.map(String::toUpperCase).forEach(System.out::println);
lambda map作用
一般用于对集合数据做过滤,如获取对象SapPurchaseTaskDetail中的id集合,可以使用
List<String> correlativeOrderIdList = taskDetailList.stream().map(SapPurchaseTaskDetail::getCorrelativeOrderId).distinct().collect(Collectors.toList());
Reduce的作用
Reduce中文含义为:减少、缩小;而Stream中的Reduce方法干的正是这样的活:根据一定的规则将Stream中的元素进行计算后返回一个唯一的值。
它有三个变种,输入参数分别是一个参数、二个参数以及三个参数;
一个参数:
Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
// 求最大值
stream.reduce((a, b) -> a >= b ? a : b).get();
两个参数:
Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
//求集合元素的和==>以初始值1作为开始,进行计算=1+1+2+3+4+5+6+7+8
Integer result = stream.reduce(1, Integer::sum);
ifPresent的作用
判断是否为空,如果不为空,使用get
AList.stream()
.filter(a -> "小明".equals(a.getUserName()))
.findFirst()
.ifPresent(a -> {
a.setUserName("明明");
})
Optional
主要是用于判断是否为空,主用于链式编程
精华帖子 : https://www.cnblogs.com/zhangboyu/p/7580262.html
Collectors.groupingBy
用于分组,返加一个map集合
detailList.stream().collect(Collectors.groupingBy(k -> k.getSiteLogisticsTaskId()));