Java25Stream流:集合对象.stream()

Posted 码农编程录

tags:

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


1.Stream流引入: list.stream().filter

package com.itheima07.boot;
import java.util.ArrayList;
import java.util.List;
// 代码冗余: 1. 循环太多 2. 判断太多
public class StreamBootDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        //张集合
        List<String> zhangList = new ArrayList<>();
        for (String name : list) {
            if (name.startsWith("张")) {
                zhangList.add(name);
            }
        }
        
        //短集合 : 张集合基础上,只要名字3个
        List<String> shortList = new ArrayList<>();
        for (String name : zhangList) {
            if (name.length() == 3) {
                shortList.add(name);
            }
        }                
        for (String name : shortList) { //遍历打印
            System.out.println(name);
        }
    }
}

在这里插入图片描述

package com.itheima07.boot;
import java.util.ArrayList;
import java.util.List;
// Stream 流: 1. 基于函数式编程延伸出来的一种用法。 2. 作用: 简化 集合数据 处理过程中的代码冗余问题
public class StreamBootDemo02 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");        
        list.stream().filter(name -> name.startsWith("张")) //name就是集合中的每个元素
                .filter(name -> name.length() == 3).forEach(name-> System.out.println(name));
    }
}

2.Stream流的获取:.stream(),Stream.of(array)

在这里插入图片描述
如下排除静态方法,ArrayList能用stream方法的话,是从Collection里继承这方法。
在这里插入图片描述

package com.itheima08.stream;
import com.sun.org.apache.bcel.internal.generic.NEW;
import java.util.*;
import java.util.stream.Stream;
/*
*   Stream 流: Stream流对象的获取:
*         1. 集合
*             Collection接口 默认方法 stream()
*         2. 数组
*           Stream.of(T...);  使用这个
*           Stream.of(T);
*/
public class StreamGetDemo {
    public static void main(String[] args) {
        Collection<String> coll = new HashSet<>();
        Stream<String> stream = coll.stream();

//1111111111111111111111111111111111111111111111111111111111111111111111111111
        HashMap<String, String> map = new HashMap<>();
//        Set set = map.keySet();
//        set.stream();
        Stream<String> stream1 = map.keySet().stream();
        Stream<Map.Entry<String, String>> stream2 = map.entrySet().stream();
        
//111111111111111111111111111111111111111111111111111111111111111111111111111
        String[] array = {"a","b"};
        Stream<String> stream3 = Stream.of(array);
        
        Integer[] array2 = {1,2,3};
        Stream<Integer> stream4 = Stream.of(array2); //T...  -> T=Integer,把每个元素拆开。//泛型 必须是 引用类型
        
        int[] array3 = {1,2,3};
        //如果说数组要获取Stream流,不要用基本类型数组, 把整个数组当成一个元素无法拆开,不要用如下
        Stream<int[]> stream5 = Stream.of(array3);// T -> T = int[]
    }
}

3.Stream流的终结方法:list.stream().count()

package com.itheima09.method;     
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Consumer;
/*
* Stream流的方法
*   1. 终结方法 : 不支持链式编程 (返回值: 基本类型)
*   2. 拼接方法 : 支持链式编程 (返回值: 当前类型,引用类型)
* 
*     终结方法:
*           1.foreach
*                   void forEach(Consumer<? super T> action);
*                   底层: 迭代器 , 需要消费参数(集合中每一个元素)
*           2.count
*                   long count() : 获取集合中的元素个数
*/
public class EndDemo {
    public static void main(String[] args) {
//       method();    //abc
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 5,3,2,4);
//        for (Integer integer : list) { //list.for快捷
//            System.out.println(integer); 
//        }

//11111111111111111111111111111111111111111111111111111111111111111111  
		//stream流打印,先获取stream流对象
       /* list.stream().forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer t) {
                System.out.println(t); //遍历打印list集合
            }
        });*/
        
		//如下等于上面
//      list.stream().forEach(t-> System.out.println(t));

//11111111111111111111111111111111111111111111111111111111111111111111
        long count = list.stream().count();
        System.out.println(count); //4
    }

    private static void method() {
       // StringBuilder sb = new StringBuilder();
       // StringBuilder sb2 = sb.append("a");
       // StringBuilder sb3 = sb2.append("b"); 
        StringBuilder sb = new StringBuilder();       
        sb.append("a").append("b").append("c").equals("abc"); //append拼接方法,equals终结方法,因为equals返回boolean基本类型,不能再调用方法
        System.out.println(sb);
    }
}

4.Stream流的拼接方法:Stream.concat

package com.itheima09.method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.function.Predicate;
import java.util.stream.Stream;
/*
*   Stream的拼接方法
*       1. filter 过滤
*            Stream<T> filter(Predicate<? super T> predicate);
*               1. Predicate : public boolean test(String s)
*               2. s是集合中每一个元素 , 迭代器
*               3. return true : 表示保留这个元素
*       2. limit 取用前几个
*              Stream<T> limit(long count)
*              只要前count个元素, 没有越界
*       3. skip 跳过前几个
*           Stream<T> skip(long n);
*       4. static concat 组合,静态方法
*           static <T> Stream<T> concat(Stream<T> a, Stream< T> b)
*           合并两个stream,整合一个stream
*/
public class ChainDemo { //Chain:链
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张三","张三丰","李四","李世石");
        
		//.filter返回值类型是stream,调完filter还能调filter,就像Stringbuild调完append还可再调append
//        list.stream().filter(new Predicate<String>() {
//            @Override
//            public boolean test(String s) {
//                return s.startsWith("张");
//            }
//        }).forEach(s -> System.out.println(s)); //张三 张三丰

//        list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s)); //等同上面

//        list.stream().limit(5).forEach(t-> System.out.println(t)); //没有索引越界,因为迭代器没有索引,最多4个就给4个

//        list.stream().skip(3).forEach(t-> System.out.println(t)); //李世石

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"王五","王五百","马六");
        Stream<String> stream1 = list.stream();
        Stream<String> stream2 = list2.stream();
        Stream.concat(stream1,stream2).forEach(t-> System.out.println(t)); //张三...7个元素
    }
}

5.Stream源码分析:consumer.accept

package com.itheima10.source;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.function.Predicate;
  
public class MyStream {
    Collection<String> coll; //属性
    public MyStream(Collection<String> coll){
        this.coll = coll;
    }
    
    public void forEach(Consumer<String> consumer){
        for (String s : coll) { //快捷键coll.foreach
            consumer.accept(s); //接口调用方法执行子类重写的方法即下面SourceDemo.java中System.out.println(t),s就是t,
        }
    }
    
    public MyStream filter(Predicate<String> predicate){        
        ArrayList<String> list = new ArrayList<>(); //list集合只添加 推断结果true的元素,新的
        for (String s : coll) {
            boolean result = predicate.test(s); //打印,父类引用调用方法执行子类重写方法即下面SourceDemo.java中t.length()==2
            if(result){
                list.add(s);
            }
        }
        coll = list;  //集合重置为list即保留下来的集合
        return this;
    }
}
package com.itheima10.source;
import java.util.ArrayList;
import java.util.Collections;

public class SourceDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张三","李四光","王五");
        /*
        *  foreach:
        *    1. 迭代器(底层)
        *    2. t是集合中的每一个元素
        *    执行次数 = 集合元素个数
        */        
       // new MyStream(list).forEach(t -> System.out.println(t));

        /*
        *   MyStream filter(Predicate<String> predicate)
        *       predicate :  boolean test(T t);
        *       1. 迭代器
        *       2. t 是集合中的每一个元素
        *       3. 返回true : 表示保留这个元素
        */
        new MyStream(list).filter(t -> t.length()==2).forEach(t-> System.out.println(t));
    }
}

在这里插入图片描述
如下案例比较:

package com.itheima11.union;
import java.util.ArrayList;
import java.util.List;

public class Demo01 {
    public static void main(String[] args) {
        List<String> one = new ArrayList<>();
        one.add("迪丽热巴");
        one.add("宋远桥");
        one.add("苏星河");
        one.add("老子");
        one.add("庄子");
        one.add("孙子");
        one.add("洪七公");
        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖");
        two.add("张二狗");
        two.add("张天爱");
        two.add("张三");       
        List<String> oneA = new ArrayList<>();  // 第一个队伍只要名字为3个字的成员姓名;
        for (String name : one) {
            if (name.length() == 3) {
                oneA.add(name);
            }
        }        
        List<String> oneB = new ArrayList<>(); // 第一个队伍筛选之后只要前3个人;
        for (int i = 0; i < 3; i++) {
            oneB.add(oneA.get(i));
        }

//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111             
        List<String> twoA = new ArrayList<>(); // 第二个队伍只要姓张的成员姓名;
        for (String name : two) {
            if (name.startsWith("张")) {
                twoA.add(name);
            }
        }        
        List<String> twoB = new ArrayList<>(); // 第二个队伍筛选之后不要前2个人;
        for (int i = 2; i < twoA.size(); i++) {
            twoB.add(twoA.get(i));
        }

//11111111111111111111111111111111111111111111111111111111111111111111111111111111111111                   
        List<String> totalNames = new ArrayList<>(); // 将两个队伍合并为一个队伍;
        totalNames.addAll(oneB);
        totalNames.addAll(twoB);                
        for (String name : totalNames) { // 打印整个队伍的姓名信息。
            System.out.println(name);
        }
    }
}
package com.itheima11.union;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Demo02 {
    public static void main(String[] args) {
        List<String> one = new ArrayList<>();
        one.add("迪丽热巴");
        one.add("宋远桥");
        one.add("苏星河");
        one.add("老子");
        one.add("庄子");
        one.add("孙子");
        one.add("洪七公");
        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖"以上是关于Java25Stream流:集合对象.stream()的主要内容,如果未能解决你的问题,请参考以下文章

获取单列集合,双列集合,数组的Stream流对象以及简单操作

Java8 Stream流使用及其基本原理

java stream 及早求值

Java8函数式编程:类比Spark RDD算子的Stream流操作

Java 8新特性之Stream流

Java8 新特性之集合操作Stream