jdk8新特性--stream流和lambda

本文详细介绍了Java 8中的两大新特性:Lambda表达式和Stream流。Lambda简化了匿名内部类的写法,注重功能而非对象。Stream流提供了数据处理的新方式,包括数据准备、中间操作(如去重、过滤、映射、排序等)和终结操作(如forEach、count、collect等)。此外,还探讨了Stream流的查找与匹配功能,如anyMatch、allMatch和findFirst。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、lambda表达式

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

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

二、steam流

数据准备

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Book {
    //id
    private Long id;
    //书名
    private String name;

    //分类
    private String category;

    //评分
    private Integer score;

    //简介
    private String intro;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Author {
    //id
    private 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;
         }
         else
             result = accumulator.apply(result, element);
     }
     return foundAny ? Optional.of(result) : Optional.empty();

例如:

年龄的最小值

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值