java 1.8 stream使用总结(个人总结有一些经典文章的集合)(二)

简介: java 1.8 stream使用总结(个人总结有一些经典文章的集合)(二)

常用方法 筛选与切片:


方法

作用

filter(Predicate p)

接受一个lambda,从stream中按照要求得得到数据

limit(n)

截断数据,是数据不要超过n个

skip(n)

跳过元素,返回一个跳过的n个元素的stream,若不足n个返回一个空流。

distinct()

通过元素的hashcode和equals去除重复元素

实体类

package com.example.demoTset2;
import lombok.Data;
@Data
public class login {
    public String name;
    public String passWord;
    public String age;
    public  login(String name, String passWord, String age) {
        super();
        this.name = name;
        this.passWord = passWord;
        this.age = age;
    }
}


filter 筛选


选出age为22的数组

package com.example.demoTset2;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Filter {
    static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
    public static void main(String[] args) {
        Stream<login> loginRequestStream = login.stream().filter((e) -> "22".equals(e.getAge()));
        loginRequestStream.forEach(System.out::println);
    }
}


运行结果为

login(name=李四, passWord=2222, age=22)


limit截断


static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
  //limit截断:
    public static void main(String[] args) {
        login.stream()
                .filter((e) -> Integer.valueOf(e.getAge()) > 11)
                .limit(1)//需要几条数据 截几条 例如:1条就是1
                .forEach(System.out::println);
    }


运行结果是

login(name=李四, passWord=2222, age=22)


skip 跳过:


static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
//skip 跳过
    public static void main(String[] args) {
        login.stream()
                .filter((e) -> Integer.valueOf(e.getAge()) > 11)
                .skip(1)//跳过2条数据 下标0,1
                .forEach(System.out::println);
    }
login(name=王五, passWord=3333, age=33)
login(name=赵六, passWord=6666, age=66)


distinct 去重


static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
//distinct 去重
    public static void main(String[] args) {
        login.stream()
                .filter((e) -> Integer.valueOf(e.getAge()) > 1)
                .distinct()
                .forEach(System.out::println);
    }


运行结果:

login(name=张三, passWord=1111, age=11)
login(name=李四, passWord=2222, age=22)
login(name=王五, passWord=3333, age=33)
login(name=赵六, passWord=6666, age=66)


包含contains 两种实现方式:


static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
 static List<login> login = Arrays.asList(
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("张三", "1111", "11"),
            new login("李四", "2222", "22"),
            new login("王五", "3333", "33"),
            new login("赵六", "6666", "66")
    );
 public static void main(String[] args) {
        Stream<login> stream = login.stream();
        stream.filter(t-> t.getName().contains("张三")).limit(3).forEach(System.out::println);
        System.out.println("-----------分割线-------");
        stream = login.stream();
        Stream<String> stream1= stream.map(t ->  t.getName());
        stream1.filter(t -> t.contains("张三")).forEach(System.out::println);
    }


运行结果为

login(name=张三, passWord=1111, age=11)
login(name=张三, passWord=1111, age=11)
login(name=张三, passWord=1111, age=11)
-----------分割线-------
张三
张三
张三


映射


方法

映射

map(Function f)

将函数作为要给参数,该函数会被应用到每一个元素上,产生一个新的DoubleStream。当然类似的还有:map ToLong(ToLongFunction f) ,mapToInt(ToIntFunction f) 等

flatMap(Function f)

将一个函数作为参数,将流(stream)中的每个值都换成另一个流,然后把所有的流连接成

map 接受lambda,讲元素转成其他形式或提取信息,接受一个函数作为参数,该函数会被应用到每一个元素上,并将其映射成一个新的元素.


flagMap 接收一个函数作为参数,将流中的每一个值都转换成另一个流,然后把所有的流了解成一个流.


toUpperCase 转成大写

public static void main(String[] args) {
        List<String> list = Arrays.asList("aaa", "bbb","www","ccc", "ddd");
        list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
    }


输出结果

AAA
BBB
WWW
CCC
DDD
package com.example.demoTset2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Test1 {
//    public static void main(String[] args) {
//        List<String> list = Arrays.asList("aaa", "bbb","www","ccc", "ddd");
//        list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
//    }
    public static void main(String[] args) {
        List<String> list=Arrays.asList("ab","cd","ef");
//  想要打印出 a b  c d  e f
//   如果使用map
        Stream<String> stream=list.stream();
        Stream<Stream<Character>> streamCs= stream.map(Test1::abc);
        streamCs.forEach(streamC->
                streamC.forEach(System.out::println)
        );
        System.out.println("-----------分割线-------");
        //   flatMap
        stream=list.stream();
        //Stream<Character> 这个直接将里面的集合进行展开
        Stream<Character> streamC=stream.flatMap(Test1::abc);
        streamC.forEach(System.out::println);
    }
//  将字符串拆成一个字符
    public static Stream<Character> abc(String str){
        List list=new ArrayList<>();
        for(Character c:str.toCharArray()) {
            list.add(c);
        }
        // 直接返回一stream 为了好操作
        return list.stream();
    }
}


运行结果是

a
b
c
d
e
f
-----------分割线-------
a
b
c
d
e
f


排序


方法

作用

sorted()

会生成一个新的流,将其按自然顺序排序

sorted(Comparator com )

会生成一个新的流,将其按比较其顺序排序

package com.example.demoTset2;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Test2 {
    public static void main(String[] args) {
        List<Integer> list= Arrays.asList(1,3,2,6,5,8);
        Stream<Integer> stream=list.stream();
        Stream<Integer> stream1=stream.sorted();
        stream1.forEach(System.out::println);
        System.out.println("-----------分割线-------");
        stream=list.stream();
        stream1=stream.sorted((o1,o2) -> Integer.compare(o2, o1) );
        stream1.forEach(System.out::println);
    }
}


运作结果是

1
2
3
5
6
8
-----------分割线-------
8
6
5
3
2


终止操作


匹配与查找


方法

作用

allMatch(Predicate p)

检查是否匹配所有的元素,如果都满足返回true,哪怕一个不满足返回false

anyMatch(Predicate p)

检查是否至少匹配一个元素,如果有一个以及一个以上返回true,否则返回false

noneMatch(Predicate p)

检查是否没有匹配一个元素,哪怕一个满足返回false,否则返回true

findFirst()

返回最后一个元素,不过其返回的是一个Optional类 (这个后面补充)

findAny()

返回当前流中的任意元素,不过其返回的是一个Optional类

allMatch:检查是否匹配所有的元素,如果都满足返回true,哪怕一个不满足返回false

//检查是否匹配所有的元素,如果都满足返回true,哪怕一个不满足返回false
    public static void main(String[] args) {
        //值全部大于0
        List<Integer> list=Arrays.asList(1,3,2);
        Stream<Integer> stream=list.stream();
        boolean b=stream.allMatch(t -> t>0);
        System.out.println(b);
        System.out.println("-----------分割线-------");
        //值全部大于2
        stream=list.stream();
        b=stream.allMatch(t -> t>2);
        System.out.println(b);
    }


运行结果是

true
-----------分割线-------
false


anyMatch:检查是否至少匹配一个元素,如果有一个以及一个以上返回true,否则返回false


/

/检查是否至少匹配一个元素,如果有一个以及一个以上返回true,否则返回false
    public static void main(String[] args) {
        List<Integer> list=Arrays.asList(1,3,2);
        Stream<Integer> stream=list.stream();
        boolean b=stream.anyMatch(t -> t>0);
        System.out.println(b);
        System.out.println("-----------分割线-------");
        stream=list.stream();
        b=stream.anyMatch(t -> t>2);
        System.out.println(b);
    }


运行结果为

true
-----------分割线-------
true


noneMatch:检查是否没有匹配一个元素,哪怕一个满足返回false,否则返回true


//检查是否没有匹配一个元素,哪怕一个满足返回false,否则返回true
    public static void main(String[] args) {
        List<Integer> list=Arrays.asList(1,3,2);
        Stream<Integer> stream=list.stream();
        boolean b=stream.noneMatch(t -> t>2);
        System.out.println(b);
        System.out.println("-----------分割线-------");
        stream=list.stream();
        b=stream.noneMatch(t -> t>5);
        System.out.println(b);
    }


运行结果为

false
-----------分割线-------
true


findFirst:返回最后一个元素,不过其返回的是一个Optional类


findAny:返回当前流中的任意元素,不过其返回的是一个Optional类

public static void main(String[] args) {
    List<Integer> list=Arrays.asList(1,3,2);
    Stream<Integer> stream=list.stream();
    Optional<Integer> OP=stream.findFirst();
    System.out.println(OP.get());
    System.out.println("-----------分割线-------");
    stream=list.stream();
    OP=stream.findAny();
    System.out.println(OP.get());
}


运行结果是

1
-----------分割线-------
1


整体demo实例:

allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false

noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false

anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false

findFirst:返回流中第一个元素

findAny:返回流中的任意元素

count:返回流中元素的总个数

max:返回流中元素最大值

min:返回流中元素最小值

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);  
boolean allMatch = list.stream().allMatch(e -> e > 10); //false
boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true
boolean anyMatch = list.stream().anyMatch(e -> e > 4); //true 
Integer findFirst = list.stream().findFirst().get(); //1
Integer findAny = list.stream().findAny().get(); //1 
long count = list.stream().count(); //5
Integer max = list.stream().max(Integer::compareTo).get(); //5
Integer min = list.stream().min(Integer::compareTo).get(); //1


归约


方法

作用

reduce(T identity, BinaryOperator accumulator)

可以将流中元素反复结合起来,得到一个值,返回T(interface BinaryOperator extends BiFunction<T,T,T>)

reduce( BinaryOperator accumulator)

可以将流中元素反复结合起来,得到一个值,返回 Optional

public static void main(String[] args) {
        List<Integer> list=Arrays.asList(1,3,2);
        // 把list中的值累加起来
        Stream<Integer> stream=list.stream();
        //为了方便理解 把这个初始值先写出来
        Integer start=0;
        Integer sum=stream.reduce(start, Integer::sum);
        System.out.println(sum);
        System.out.println("-----------分割线-------");
        stream=list.stream();
        start=1;
        sum=stream.reduce(start, Integer::sum);
        System.out.println(sum);
    }


运行结果是

6
-----------分割线-------
7
相关文章
|
11天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
21 2
|
11天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
15天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
15天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
15天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
12 0
|
Java
Java8中stream流处理数据21个小案例(学习使用)
Java8中stream流处理数据21个小案例(学习使用)
96 0
|
SQL 存储 前端开发
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
141 0
【Java技术指南】「Java8技术盲区」在奔向Java13的同时,也让我们仔细研究一下Stream的学习认知!
|
Java 程序员 API
Java 8 Stream API学习总结
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
1033 0
|
Java API 安全
JAVA8--Stream学习
Stream是什么 怎么使用Stream Stream的建立 Stream中的元素操作 Stream聚合操作 Stream结果处理 Stream分组操作 Stream注意事项 Stream是什么 书上说Stream是对JAVA中对集合处理的抽象,在我看来Stream更像是对java集合的一次扩展,因为Stream中的API都是我们对集合操作中可能遇
1785 0
|
5天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
下一篇
无影云桌面