java8的stream的中间操作有状态

本文详细介绍了Java 8 Stream API中的无状态操作,包括distinct、skip和limit,并重点讲解了排序操作sorted的使用,包括自然序排序、自定义Comparator排序以及多条件排序的实现。示例代码展示了如何在实际编程中应用这些概念,帮助读者深入理解Stream API的高级特性。
摘要由CSDN通过智能技术生成
Stream

img

无状态:指元素的处理不受之前元素的影响;

有状态:指该操作只有拿到所有元素之后才能继续下去。

非短路操作:指必须处理所有元素才能得到最终结果;

短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。
中间操作有状态
distinct
去重 distinct
List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9,1,1,1,9,9,9);
list.stream().distinct().forEach(System.out::print);//123456789
skip
跳过
List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9);
list.stream().skip(3).forEach(System.out::print);//456789,跳过前三个
limit
 List<Integer> list = Arrays.asList(1, 2,3, 4, 5, 6, 7, 8, 9);
 list.stream().limit(5).forEach(System.out::print);//12345, 截取前5个
sorted

能够以自然序或着 用Comparator 接口定义的排序规则 来排序一个流。Comparator 能用用lambada表达式来初始化, 我们还能够逆序一个已经排序的流。
接下来我们将会使用java 8 的流式sorted排序 List 、Map 、 Set

1、sorted() 默认使用自然序排序, 其中的元素必须实现Comparable 接口
2、sorted(Comparator comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。

下面代码以自然序排序一个list
list.stream().sorted() 

自然序逆序元素,使用Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.reverseOrder()) 

使用Comparator 来排序一个list,其中放对象的属性,元素逆序
list.stream().sorted(Comparator.comparing(Student::getAge).reversed()) 

//因为返回的都是stream,所以还需要将它们根据传入的数据类型进行collec进行转换。

Comparator接口======》java.util包下的

方法compare(Object a,Object b); 使用Comparator排序

@Data
@NoArgsConstructor
@ToString
public class Person {
    private String name;
    private Integer age;
}


****************
package com.it.test;
import java.util.ArrayList;
 
import java.util.List;
import com.it.pojo.Person;
 
 
import java.util.Comparator;
import java.util.stream.Collectors;
 
public class StreamTest {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setAge(21);
        person1.setName("21");
 
        Person person2 = new Person();
        person2.setAge(19);
        person2.setName("19");
 
        Person person3 = new Person();
        person3.setAge(19);
        person3.setName("20");
 
        Person person4 = new Person();
        person4.setAge(20);
        person4.setName("20");
 
        Person person5 = new Person();
        person5.setAge(19);
        person5.setName("18");
        
        List<Person> people = new ArrayList<>();
        people.add(person1);
        people.add(person2);
        people.add(person3);
        people.add(person4);
        people.add(person5);
       
        List<Person> collect1 = people.stream().sorted((Comparator.comparing(Person::getAge))).collect(Collectors.toList());//只根据年龄排序,升序
        System.out.println(collect2);
        
         List<Person> collect2 = people.stream().sorted((Comparator.comparing(Person::getAge)).reversed()).collect(Collectors.toList());//只根据年龄排序,降序
        System.out.println(collect2);
        
        List<Person> collect3 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,都升序
        System.out.println(collect3);
       
         List<Person> collect4 = people.stream().sorted((Comparator.comparing(Person::getAge)).thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());/先根据年龄进行排序,遇见相同的,然后根据姓名进行排序,降序【都降序】
        System.out.println(collect4);
      
         
        List<Person> collect5 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName)).reversed()).collect(Collectors.toList());//年龄升序,姓名降序
        System.out.println(collect5);
 
        
       List<Person> collect6 = people.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());//根据年龄降序,姓名升序
        System.out.println(collect6);      
    }
}

结果

只根据年龄进行排序的,默认是升序

[外链图片转存中…(img-uKEmdv5y-1630250447691)]

根据年龄降序

img

先根据年龄,后根据姓名排序的,默认都是升序

[外链图片转存中…(img-RyYWVt5D-1630250447693)]

根据年龄和性别,先根据年龄,年龄相同根据性别,只在最后一个comparing上写reversed,两个排序都是降序【根据年龄降序,姓名降序】

[外链图片转存中…(img-12kjUlGR-1630250447694)]

根据年龄升序,年龄相同,根据姓名降序

[外链图片转存中…(img-1q5G32mh-1630250447696)]

排序
List<Integer> list2 = Arrays.asList(1, 4,3, 2, 5, 7, 6, 8, 9);
list2.stream().sorted().collect(Collectors.toList()).forEach(System.out::print);//正序   	
list2.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).forEach(System.out::print);//倒序

寄语:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的泡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值