前言
Java8 的新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、ConcurrentHashMap、MetaSpace。总得来说,Java8 的新特性使 Java 的运行速度更快、代码更少、便于并行、最大化减少空指针异常。
0x00. 前置数据
private List<People> peoples = null; @BeforeEach void before () { peoples = new ArrayList<>(); peoples.add(new People("K.O1", 21, new Date())); peoples.add(new People("K.O3", 23, new Date())); peoples.add(new People("K.O4", 24, new Date())); peoples.add(new People("K.O5", 25, new Date())); peoples.add(new People("K.O2", 22, new Date())); peoples.add(new People("K.O6", 26, new Date())); }
0x01. 提取对象中的一列
/** * 提取1列 */ @Test void whenExtractColumnSuccess () { //第一种写法 List<Integer> ages1 = peoples.stream().map(people -> people.getAge()).collect(Collectors.toList()); System.out.println("###println: args1----"); ages1.forEach(System.out::println); //简单一点的写法 List<Integer> ages2 = peoples.stream().map(People::getAge).collect(Collectors.toList()); System.out.println("###println: args2----"); ages1.forEach(System.out::println); }
###println: args1----
21
22
23
24
25
26
###println: args2----
21
22
23
24
25
26
/** * 只要年纪大于25岁的人 */ @Test void whenFilterAgeGT25Success () { List<People> peoples1 = peoples.stream().filter(x -> x.getAge() > 25).collect(Collectors.toList()); peoples1.forEach(x -> System.out.println(x.toString())); }
People{name='K.O6', age=26, birthday=Wed May 15 22:20:22 CST 2019}
0x03. 列表中对象数值型列数据求和
/** * 求和全部年纪 */ @Test void sumAllPeopleAgeSuccess () { Integer sum1 = peoples.stream().collect(Collectors.summingInt(People::getAge)); System.out.println("###sum1: " + sum1); Integer sum2 = peoples.stream().mapToInt(People::getAge).sum(); System.out.println("###sum2: " + sum2); }
###sum1: 141
###sum2: 141
0x04. 取出集合符合条件的第一个元素
/** * 取出年纪为25岁的人 */ @Test void extractAgeEQ25Success () { Optional<People> optionalPeople = peoples.stream().filter(x -> x.getAge() == 25).findFirst(); if (optionalPeople.isPresent()) System.out.println("###name1: " + optionalPeople.get().getName()); //简写 peoples.stream().filter(x -> x.getAge() == 25).findFirst().ifPresent(x -> System.out.println("###name2: " + x.getName())); }
###name1: K.O5
###name2: K.O5
0x05. 对集合中对象字符列按规则拼接
/** * 逗号拼接全部名字 */ @Test void printAllNameSuccess () { String names = peoples.stream().map(People::getName).collect(Collectors.joining(",")); System.out.println(names); }
K.O1,K.O2,K.O3,K.O4,K.O5,K.O6
0x06. 将集合元素提取,转为Map
/** * 将集合转成(name, age) 的map */ @Test void list2MapSuccess () { Map<String, Integer> map1 = peoples.stream().collect(Collectors.toMap(People::getName, People::getAge)); map1.forEach((k, v) -> System.out.println(k + ":" + v)); System.out.println("--------"); //(name object) Map<String, People> map2 = peoples.stream().collect(Collectors.toMap(People::getName, People::getThis)); map2.forEach((k, v) -> System.out.println(k + ":" + v.toString())); } //People中自己实现的方法 public People getThis () { return this; }
K.O2:22
K.O3:23
K.O1:21
K.O6:26
K.O4:24
K.O5:25
--------
K.O2:People{name='K.O2', age=22, birthday=Wed May 15 22:42:39 CST 2019}
K.O3:People{name='K.O3', age=23, birthday=Wed May 15 22:42:39 CST 2019}
K.O1:People{name='K.O1', age=21, birthday=Wed May 15 22:42:39 CST 2019}
K.O6:People{name='K.O6', age=26, birthday=Wed May 15 22:42:39 CST 2019}
K.O4:People{name='K.O4', age=24, birthday=Wed May 15 22:42:39 CST 2019}
K.O5:People{name='K.O5', age=25, birthday=Wed May 15 22:42:39 CST 2019}
0x07. 按集合某一属性进行分组
/** * 按名字分组 */ @Test void listGroupByNameSuccess() { //添加一个元素方便看效果 peoples.add(new People("K.O1", 29, new Date())); Map<String, List<People>> map = peoples.stream().collect(Collectors.groupingBy(People::getName)); map.forEach((k, v) -> System.out.println(k + ":" + v.size())); }
K.O2:1
K.O3:1
K.O1:2
K.O6:1
K.O4:1
K.O5:1
0x08. 求集合对象数值列平均数
/** * 求人平均年龄 */ @Test void averagingAgeSuccess () { Double avgAge = peoples.stream().collect(Collectors.averagingInt(People::getAge)); System.out.println(avgAge); }
23.5
0x09. 对集合按某一列排序
/** * 按年龄排序 */ @Test void sortByAgeSuccess () { System.out.println("###排序前---"); peoples.forEach(x -> System.out.println(x.getAge())); peoples.sort((x, y) -> { if (x.getAge() > y.getAge()) { return 1; } else if (x.getAge() == y.getAge()) { return 0; } return -1; }); System.out.println("###排序后---"); peoples.forEach(x -> System.out.println(x.getAge())); }
###排序前---
21
23
24
25
22
26
###排序后---
21
22
23
24
25
26
未完待续
<源码地址:https://github.com/cos2a/learning-repo/tree/master/core-java8>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。
1 Java8 Lambda表达式的介绍 Lambda表达式是Java8中包含的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在Collection集合中非常有用。它有助于集合元素的迭代,过滤和从集合中提取数据。 Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用Lambda表达式的情况下,我们无需再次定义用于提供实现的方法。我们只编写实现代码
本文向大家介绍Java8 Lambda表达式详解及实例,包括了Java8 Lambda表达式详解及实例的使用技巧和注意事项,需要的朋友参考一下 第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: 上面的例子如果改成使用Lambda就会简单许多: Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参
我最近接触了Java8,我正在尝试学习Lambda表达式。我想做一些图形计算,我的代码到目前为止: 所有这些代码都是用于图形的,除了和使用的操作之外,所有内容都是基本的数学(加、减、乘、模),并且可以单独针对每个像素执行。 现在的问题是:有可能在GPU上运行这个吗?或者这甚至是自动基于GPU的?(我记得在什么地方读到过这个,但我不确定)
本文向大家介绍python中Lambda表达式详解,包括了python中Lambda表达式详解的使用技巧和注意事项,需要的朋友参考一下 如果你在学校读的是计算机科学专业,那么可能学过 Lambda 表达式, 不过可能从来没有用过它。如果你不是计算机科学专业,它们看着可能 有点儿陌生(或者只是“曾经学习过的东西”)。在这一节里,虽然我们 不打算深入学习这类函数,但是会用几个例子来演示它们是如何用在网
既然我有一个带有两个方法的,那么我如何用一个具体的类实现它呢?如何为这两种方法编写Lambda表达式?
本文向大家介绍Java8使用lambda表达式调用静态方法,包括了Java8使用lambda表达式调用静态方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式允许您将功能作为参数传递给方法。您还可以使用lambda表达式调用现有的方法。 方法引用是简单的、易于阅读的lambda表达式,可以通过lambda表达式中的名称调用/引用现有的方法。可以使用方法引用引用类中定义的静态