JDK1.8新特性

JDK1.8新特性

  • lambda表达式
    • 创建匿名内部类
    • lambda和stream结合:过滤
    • lambda和stream结合:过滤+统计
    • lambda双冒号的使用
    • lambda map和stream.forEach 区别
    • lambda map作用
    • Reduce的作用
    • ifPresent的作用
    • Optional
    • Collectors.groupingBy

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

你可能感兴趣的:(传智java基础)