Java之Stream流

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之Stream流相关的知识,希望对你有一定的参考价值。

本文主要介绍了Stream流,包括集合和数组的Stream流创建方式,List和Set集合直接使用stream()方法创建,Map集合间接使用stream()方法创建,而数组使用Stream流的静态方法of()创建,介绍了Stream流的中间操作,包括过滤filter(),限制limit()和跳过skip(),拼接concat)(),去重distinct(),排序sorted()等,最后介绍了Stream流的终结操作forEach()和count(),也给出Stream流的收集操作方法和综合练习。

目录

1、一个案例体验Stream流

2、Stream流的常见生成方式

3、Stream流的中间操作之filter

4、Stream流之中间操作limit与skip

5、Stream流中间操作之concat与distinct

6、Stream流之中间操作sorted

7、Stream之中间操作map与mapToInt

8、Stream流的常用终结操作符forEach与count

9、Stream流的收集操作(将流中数据收集到集合中)

10、Stream流综合练习


1、一个案例体验Stream流

import java.util.ArrayList;

public class StreamDemo01 
    public static void main(String[] args) 
        ArrayList<String> arrayList = new ArrayList<>() ;
        arrayList.add("张无忌") ;
        arrayList.add("张三");
        arrayList.add("李四");
        arrayList.add("张三丰");
        arrayList.add("刘小明");

        //找出姓张且名字为3个字的打印输出
        arrayList.stream().filter(s->s.length()==3).filter(s->s.startsWith("张")).forEach(System.out::println);

    

2、Stream流的常见生成方式

import java.util.*;
import java.util.stream.Stream;

public class StreamDemo02 
    public static void main(String[] args) 
        //Collection体系的默认使用stream()方法生成流
        List<String> list = new ArrayList<>() ;
        Stream<String> stream1 = list.stream() ;

        Set<String> set = new TreeSet<>() ;
        Stream<String> stream2 = list.stream() ;

        //Map集合使用间接的方式生成
        Map<String,Integer> map = new HashMap<>() ;
        Stream<String> stream3 = map.keySet().stream() ;
        Stream<Integer> stream4 = map.values().stream() ;
        Stream<Map.Entry<String,Integer>> stream5 = map.entrySet().stream() ;

        //数组通过Stream的静态方法of()生成流
        String [] arr = "java","python","c++" ;
        Stream<String> stream6 = Stream.of(arr) ;
        Stream<String> stream7 = Stream.of("java","python","c++") ;
        Stream<Integer> stream8 = Stream.of(10,20,30) ;

    

3、Stream流的中间操作之filter

import java.util.ArrayList;
import java.util.List;

public class StreamDemo03 
    public static void main(String[] args) 
        List<String> list = new ArrayList<>() ;
        list.add("张三");
        list.add("张无忌") ;
        list.add("孙小美") ;
        list.add("王五") ;
        list.add("张三丰") ;

        //找出姓张的并输出
        list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);
        System.out.println("-------------");
        //找出名字长度为3的输出
        list.stream().filter(s->s.length()==3).forEach(s-> System.out.println(s));
        System.out.println("-------------");
        //找出姓张且名字长度为3的输出
        list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
    

4、Stream流之中间操作limit与skip

import java.util.ArrayList;
import java.util.List;

public class StreamDemo04 
    public static void main(String[] args) 
        List<String> list = new ArrayList<>() ;
        list.add("张三");
        list.add("张无忌") ;
        list.add("孙小美") ;
        list.add("王五") ;
        list.add("张三丰") ;

        //取前面三个元素打印
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("-------------");
        //跳过两个元素,打印剩下的
        list.stream().skip(2).forEach(System.out::println);
        System.out.println("-------------");
        //跳过2个元素,剩余元素中打印前2个
        list.stream().skip(2).limit(2).forEach(s-> System.out.println(s));
    

5、Stream流中间操作之concat与distinct

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo05 
    public static void main(String[] args)    List<String> list = new ArrayList<>() ;
        list.add("张三");
        list.add("张无忌") ;
        list.add("孙小美") ;
        list.add("王五") ;
        list.add("张三丰") ;

        //取前面4个元素
        Stream<String> s1 = list.stream().limit(4) ;
        //跳过两个元素
        Stream<String> s2 = list.stream().skip(2) ;
        //合并 前面两个并输出
//        Stream.concat(s1,s2).forEach(System.out::println);
//        System.out.println("-------------");
        //合并前面两个,去重后输出
        Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s));

    

6、Stream流之中间操作sorted

import java.util.ArrayList;
import java.util.Comparator;

public class StreamDemo06 
    public static void main(String[] args) 
        ArrayList<String> arrayList = new ArrayList<>() ;
        arrayList.add("zhangsan") ;
        arrayList.add("lisi") ;
        arrayList.add("wangwu") ;
        arrayList.add("malu") ;
        arrayList.add("liaoxiang") ;

        arrayList.stream().sorted((s1,s2)->
            int num1 = s1.length() -s2.length() ;
            int num2 = num1==0 ? s1.compareTo(s2) : num1 ;
            return num2 ;
        ).forEach(System.out::println);

        System.out.println("----------------");

        arrayList.stream().sorted(new Comparator<String>() 
            @Override
            public int compare(String s1, String s2) 
                int num1 = s1.length() -s2.length() ;
                int num2 = num1==0 ? s1.compareTo(s2) : num1 ;
                return num2 ;
            
        ).forEach(s-> System.out.println(s));

    

7、Stream之中间操作map与mapToInt

import java.util.ArrayList;

public class StreamDemo07 
    public static void main(String[] args) 
        ArrayList<String> arrayList = new ArrayList<>() ;
        arrayList.add("10") ;
        arrayList.add("20") ;
        arrayList.add("30") ;

        //集合元素转换成整数后输出
        arrayList.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);

        //集合元素转换成整数求和输出
        int sum = arrayList.stream().mapToInt(Integer::parseInt).sum() ;
        System.out.println(sum);
    

8、Stream流的常用终结操作符forEach与count

import java.util.ArrayList;
import java.util.List;

public class StreamDemo08 
    public static void main(String[] args) 
        List<String> list = new ArrayList<>() ;
        list.add("张三");
        list.add("张无忌") ;
        list.add("孙小美") ;
        list.add("王五") ;
        list.add("张三丰") ;

        //统计集合中张开头的元素个数
        long cnt = list.stream().filter(s->s.startsWith("张")).count() ;
        System.out.println(cnt);

        //输出集合元素
        list.stream().forEach(System.out::println);
    

9、Stream流的收集操作(将流中数据收集到集合中)


import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo09 
    public static void main(String[] args) 
        List<String> list = new ArrayList<>() ;
        list.add("张三") ;
        list.add("李四") ;
        list.add("王五子") ;

        Stream<String> stream1 = list.stream().filter(s->s.length()==2) ;
        List<String> list1 = stream1.collect(Collectors.toList()) ; //收集操作

        for(String s : list1)
            System.out.println(s);
        

        System.out.println("---------------");

        Set<Integer> set = new TreeSet<>() ;
        set.add(10) ;
        set.add(20) ;
        set.add(30) ;
        Stream<Integer> stream2 = set.stream().filter(s->s>=20) ;
        Set<Integer>set1 = stream2.collect(Collectors.toSet()) ;
        for(Integer i : set1)
            System.out.println(i);
        
        System.out.println("---------------");

        String [] arr = "张三,20","李四,19","王五,21" ;
        //得到年龄大于等于20的流
        Stream<String> stream3 = Stream.of(arr).filter(s->Integer.parseInt(s.split(",")[1])>=20) ;
        Map<String,Integer> map = stream3.collect(Collectors.toMap(s->s.split(",")[0],s->Integer.parseInt(s.split(",")[1]))) ;

        for(String key : map.keySet())
            System.out.println(key + ":" + map.get(key));
        
        
    

10、Stream流综合练习

public class Actor 
    private String name ;

    public Actor(String name) 
        this.name = name;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

import java.util.ArrayList;
import java.util.stream.Stream;

public class StreamDemo10 
    public static void main(String[] args) 
        ArrayList<String> arrayList1 = new ArrayList<>() ;
        arrayList1.add("周伯通") ;
        arrayList1.add("杨过") ;
        arrayList1.add("郭靖") ;
        arrayList1.add("张无忌") ;
        arrayList1.add("张三丰") ;

        ArrayList<String> arrayList2 = new ArrayList<>() ;
        arrayList2.add("林龙女") ;
        arrayList2.add("林黛玉") ;
        arrayList2.add("林学苑") ;
        arrayList2.add("薛宝钗") ;
        arrayList2.add("林大美") ;

        //男的只要名字为三个字的
        Stream<String> s1 = arrayList1.stream().filter(s->s.length()==3) ;
        //女的只要姓林的,并且不要第一个
        Stream<String> s2 = arrayList2.stream().skip(1).filter(s->s.startsWith("林")) ;
        //过滤后的男女名字合并到一起
        Stream<String> s3 = Stream.concat(s1,s2) ;
        //将上一步的操作作为构造方法的参数创建对象,遍历数据
        s3.map(Actor::new).forEach(s-> System.out.println(s.getName()));

    

以上是关于Java之Stream流的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 Stream 流

Java函数式编程之Stream流编程

技术干货|Java函数式编程之——Stream流

重点知识学习--[Java 8 之 Stream流]

java8-Stream之数值流

Java基础之Stream流(JDK1.8新特性)