> 文章列表 > jdk8新特性--stream流和lambda

jdk8新特性--stream流和lambda

jdk8新特性--stream流和lambda

一、lambda表达式

Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作

(27条消息) java1.8新特性--lambda表达式_java1.8lambda_匿名热心市民的博客-CSDN博客https://blog.csdn.net/weixin_43766390/article/details/125878968?spm=1001.2014.3001.5501

二、steam流

数据准备

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Book {//idprivate Long id;//书名private String name;//分类private String category;//评分private Integer score;//简介private String intro;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Author {//idprivate Long id;//姓名private String name;//年龄private Integer age;//简介private String intro;//作品private List<Book> books;}
public static List<Author> getAuthors() {//数据初始化Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);Author author2 = new Author(2L,"亚拉索",15,"狂风也追逐不上他的思考速度",null);Author author3 = new Author(3L,"易",14,"是这个世界在限制他的思维",null);Author author4 = new Author(3L,"易",14,"是这个世界在限制他的思维",null);//书籍列表List<Book> books1 = new ArrayList<>();List<Book> books2 = new ArrayList<>();List<Book> books3 = new ArrayList<>();books1.add(new Book(1L,"刀的两侧是光明与黑暗","哲学,爱情",88,"用一把刀划分了爱恨"));books1.add(new Book(2L,"一个人不能死在同一把刀下","个人成长,爱情",99,"讲述如何从失败中明悟真理"));books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));books2.add(new Book(4L,"吹或不吹","爱情,个人传记",56,"一个哲学家的恋爱观注定很难把他所在的时代理解"));books3.add(new Book(5L,"你的剑就是我的剑","爱情",56,"无法想象一个武者能对他的伴侣这么的宽容"));books3.add(new Book(6L,"风与剑","个人传记",100,"两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?"));books3.add(new Book(6L,"风与剑","个人传记",100,"两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢?"));author.setBooks(books1);author2.setBooks(books2);author3.setBooks(books3);author4.setBooks(books3);List<Author> authorList = new ArrayList<>(Arrays.asList(author,author2,author3,author4));return authorList;}

1.创建流对象

单列数据集合:

集合对象.stream()

List<Author> authors = getAuthors();
Stream<Author> stream = authors.stream();

数组:

Integer[] arr = {1,2,3,4};
//使用 Arrays.stream创建
Stream<Integer> stream = Arrays.stream(arr);
//使用 Stream.of
Stream<Integer> arr1 = Stream.of(arr);

双列集合:

转换为单列集合后再创建

使用 map.entrySet()转换

Map<String,Integer> map = new HashMap<>();
map.put("蜡笔小新",19);
map.put("黑子",17);
map.put("日向翔阳",16);
//转换为单列
Set<Map.Entry<String, Integer>> entries = map.entrySet();
//获取stream流
Stream<Map.Entry<String, Integer>> stream = entries.stream();

中间操作

去重 distinct

可以去除流中的重复元素

List<Author> authorList = getAuthors();authorList.stream().distinct()//去重.forEach(author -> System.out.println(author)); //打印

注意:distinct方法是依赖Object的equals方法来判断是否是相同对象的。所以需要注意重写equals方法。

 不使用注解的话可以手动重写

过滤 filter

可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中。

        List<Author> authorList = getAuthors();authorList.stream().filter(author -> author.getAge() > 15) .forEach(author -> System.out.println(author));

map 转换或计算

可以把对流中的元素进行计算或转换。

例如:打印姓名

 authorList.stream().map(author -> author.getName()) //获取名字.forEach(s -> System.out.println(s));

例如:年龄加10

 authorList.stream().map(author -> author.getAge()).map(age -> age + 10).forEach(s -> System.out.println(s));

 排序 sorted

可以对流中的元素进行排序。

 有空参和有参两种方式

注意:如果调用空参的sorted()方法,需要流中的元素是实现了Comparable。

调用空参:

        authorList.stream().sorted().forEach(System.out::println);

对象需要实现接口:

 调用有参:

 

保留指定条数数据 limit

可以设置流的最大长度,超出的部分将被抛弃。

跳过前几条数据 skip

跳过流中的前n个元素,返回剩下的元素

 对象转换  flatMap

map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。

简而言之就是,map是一对一转换,flatMap是一对多转换。

flatMap要求返回值是stream流对象。

我们在数据准备中可以看到,book是在author中的另一个对象集合

终结操作

steam流必须以终结操作结尾,如果无终结操作,那么中间操作不会有结果

打印  forEach

对流中的元素进行遍历操作,我们通过传入的参数去指定对遍历到的元素进行什么具体操作。

普通

超简化版

计数 count

可以用来获取当前流中元素的个数。

求最值 min max

可以用来获取流中的最值。

例子:求年龄最值

调用max

调用min

 集合转换 collect

转换为list集合

转换为set集合

 转换为map集合

查找与匹配

anyMatch

​ 可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型。

例如:查找有没有30岁以上的人

allMatch

​ 可以用来判断是否都符合匹配条件,结果为boolean类型。如果都符合结果为true,否则结果为false。

noneMatch

​ 可以判断流中的元素是否符合匹配条件。如果都不符合结果为true,否则结果为false

 findAny 

获取流中的任意一个元素。该方法没有办法保证获取的一定是流中的第一个元素。

findFirst

获取流中的第一个元素。

归并 reduce

对流中的数据按照你指定的计算方式计算出一个结果。(缩减操作)

​ reduce的作用是把stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和初始化值进行计算,计算结果再和后面的元素计算。

reduce两个参数的重载形式内部的计算方式如下:

其中identity就是我们可以通过方法参数传入的初始值,accumulator的apply具体进行什么计算也是我们通过方法参数来确定的。

T result = identity;
for (T element : this stream)result = accumulator.apply(result, element)
return result;j

两个参数:

例如:

使用reduce求所有作者年龄的和  

初始值为一个参数,操作整体作为一个参数

使用reduce求所有作者中年龄的最大值

使用reduce求所有作者中年龄的最小值

reduce一个参数的重载形式内部的计算:

 boolean foundAny = false;T result = null;for (T element : this stream) {if (!foundAny) {foundAny = true;result = element;}elseresult = accumulator.apply(result, element);}return foundAny ? Optional.of(result) : Optional.empty();

例如:

年龄的最小值

未完,等有空再写。。。。。。。

娱乐常识