Java流Stream使用详解(中)

  • Stream流的中间方法

名称

说明

Stream filter(Predicate predicate)

过滤

Stream limit(long maxSize)

获取前几个元素

Stream skip(long n)

跳过前几个元素

Stream distinct()

元素去重,依赖(hashCode和equals方法)

static  Stream concat(Stream a,Stream b)

合并a和b两个流为一个流

Stream map(Functionmapper)

转换流中的数据类型

  1. 注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
  2. 注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
  • 方法filter、limit及skip的使用示例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

public class StreamMiddle1 {
    public static void main(String[] args) {
        // 创建列表并添加元素
        ArrayList list = new ArrayList<>();
        Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");

        // filter 过滤 把"张"开头的留下, 其余数据过滤不要
        list.stream().filter(new Predicate() {
            @Override
            public boolean test(String s) {
                // test方法的返回值如果为true,表示当前数据留下
                // 如果返回值为false,表示当前数据舍弃不要
                boolean result = s.startsWith("张");
                return result;
            }
        }).forEach(s -> System.out.println(s));

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

        // limit 获取前几个元素
        // 打印前三个元素
        list.stream().limit(3).forEach(s -> System.out.println(s));

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

        // skip 跳过几个元素
        // 跳过前4个元素
        list.stream().skip(4).forEach(s -> System.out.println(s));

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

        // 打印中间的三个名字
        list.stream().limit(6).skip(3).forEach(s -> System.out.println(s));
    }
}
  • 方法distinct和concat使用示例
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;

public class StreamMiddle2 {
    public static void main(String[] args) {
        /*
         * distinct 元素去重,依赖hashCode和equals方法
         * concat 合并a和b两个流为一个流
         */

        ArrayList list1 = new ArrayList<>();
        Collections.addAll(list1,"张无忌","张无忌","张无忌","张强","张三丰","张翠山","张良","王二麻子","谢广坤");
        ArrayList list2 = new ArrayList<>();
        Collections.addAll(list2,"周芷若","赵敏");

        // 去重
        list1.stream().distinct().forEach(s -> System.out.println(s));

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

        // 合并2个流,使用Stream.concat方法
        Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));
    }
}
  • 方法map的使用示例
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;

public class StreamMiddle3 {
    public static void main(String[] args) {
        /*
        map
        转换流中的数据类型

        注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
        注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
        */

        ArrayList list =new ArrayList<>();
        Collections.addAll(list,"张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37");
        //只获取里面的年龄并进行打印
        //String->int

        //第一个类型:流中原本的数据类型
        //第二个类型:要转成之后的类型

        //apply的形参s:依次表示流里面的每一个数据
        //返回值:表示转换之后的数据
        list.stream().map(new Function() {
            @Override
            public Integer apply(String s) {
                String[] arr = s.split("-");
                String ageString = arr[1];
                int age = Integer.parseInt(ageString);
                return age;
            }
        }).forEach(s -> System.out.println(s));
        // 上面方法体可以改成lambda表达式形式,如下:
        list.stream()
                .map(s -> Integer.parseInt(s.split("-")[1]))
                .forEach(s -> System.out.println(s));
    }
}

  • Stream流的终结方法

名称

说明

void forEach(Consumer action)

遍历

long count()

统计

toArray()

收集流中的数据,放到数组中

collect(Collector collector)

收集流中的数据,放到集合中

示例代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;

public class StreamDemo9 {
    public static void main(String[] args) {
        /*
        void forEach(Consumer action)   遍历
        long count()                    统计
        toArray()                       收集流中的数据,放到数组中
        */

        // 创建数组
        ArrayList list =new ArrayList<>();
        // 添加元素
        Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");

        // 遍历
        list.stream().forEach(new Consumer() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

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

        // 统计
        long count = list.stream().count();
        System.out.println(count);

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

        // toArray数组:收集流中的数据,放到数组中
        //
        /*
        Object[] array = list.stream().toArray();
        System.out.println(array);
        for (Object o : array) {
            System.out.println(o);
        }
        */

        // IntFunction的泛型: 具体类型的数组
        // apply的形参:流中数据的个数,要跟数组的长度保持一致,把Object改成String
        // apply的返回值:具体类型的数组
        // 方法体:创建数组
        /*
        String[] arr = list.stream().toArray(new IntFunction() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });

        System.out.println(Arrays.toString(arr));
        */

        // 或者也可以简写,如下:
        String[] arr2 = list.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
        
    }
}

你可能感兴趣的:(java)