JDK8 新特性之Stream 流

本文详细介绍了Java8中的Stream API,包括如何通过stream()和parallelStream()获取流,以及使用forEach、map、filter、limit、skip、sorted、distinct等方法进行数据操作。此外,还展示了如何利用collect方法将流转换回集合,以及如何进行自定义排序和去重操作。这些内容有助于提升Java程序员的代码质量和效率。
摘要由CSDN通过智能技术生成

Stream 流

1 介绍

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 主要用于集合操作,极大的简化了代码,同时支持链式编程。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

public interface Stream<T> extends BaseStream<T, Stream<T>> {}

1.1 获取Stream流

​ 在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。
public class Stream01 {
    /*
    在 Java 8 中, 集合接口有两个方法来生成流:
    stream()         − 为集合创建串行流。
    parallelStream() − 为集合创建并行流。
*/
    public static void main(String[] args) {
        //代码演示:
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        //获取stream流
        Stream<Integer> stream = list.stream();
        
        /*ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(5);
        arrayList.add(6);
        Stream stream1 = arrayList.stream();*/
    }
}

1.2 Stream的forEach方法

遍历

/**
 * 需求:过滤出集合中的非空字符串,并以集合返回
 */
public class Stream_Collectors_toLis{
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //过滤非空字符串,先打印看看
        strings.stream().filter(s->s.isEmpty()).forEach(System.out::println);
        //将过滤的结果转为集合:collect(Collectors.toList())
        List<String> collect = strings.stream()
                .filter(s->s.isEmpty())
                .collect(Collectors.toList());

        //其他方法
        List<String> stringss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //把过滤后的结果转为 逗号 拼接的字符串
        String collect1 = stringss.stream().filter(s -> s.isEmpty()).collect(Collectors.joining(","));
        //-------------------------
        List<String> stringsss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //统计非空元素的个数
        long count = stringsss.stream().filter(s -> s.isEmpty()).count();

    }
}

1.3 Stream的map方法

map函数的作用就是针对管道流中的每一个数据元素进行转换操作。

/**
 * 需求1:求集合中每个元素的平方,并打印。
 */
public class Stream_map {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        //使用map方法实现:map()允许传入一个函数式接口Function的实现
        //该接口 泛型1:表示传入参数类型,泛型2:表示返回值类型
        /*list.stream().map(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer t) {
                return t*t;
            }
        });*/
        //lambda表达式
        list.stream().map(t -> t * t).forEach(System.out::println);

        /**
         * 需求2:获得集合中每个人的名字,并打印。
         */
        List<People> list1 = Arrays.asList(new People("张三", 18), new People("李四", 19));
        //这里的p在调用方法getName,所以是特殊情况,可以使用静态方法的方式
        list1.stream().map(People::getName).forEach(System.out::println);

    }
}
class People{
    private String name;
    private int age;

    public People() {
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "people{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

1.4 Stream的filter方法

过滤

/**
 * 需求:打印大于3的数
 */
public class Stream_filter {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
        //使用 filter() 过滤方法实现
       /* list.stream().filter(new Predicate<Integer>() {
            @Override
            public boolean test(Integer t) {
                return t>3; //过滤条件
            }
        });*/
        list.stream().filter(t -> t >= 3).forEach(System.out::println);
    }
}

1.5 Stream的 limit方法 和 skip方法

limit:截取前n个;

skip:去掉前n个;

public class Stream_limit_Or_skip {
    public static void main(String[] args) {
        /**
         * 需求:截取前N个元素,limit(n)
         */
        //需求:截取前3个, 结果:1,2,3
        List<Integer> list = Arrays.asList(1,2,3,4,5,6);
        list.stream().limit(3).forEach(System.out::println);
        /**
         * 需求:去掉前N个元素,skip(n)
         */
        //需求:去掉前3个, 结果:4,5,6
        List<Integer> list1 = Arrays.asList(1,2,3,4,5,6);
        list1.stream().skip(3).forEach(System.out::println);
        /**
         * 需求:打印除了第一个和最后一个以外的元素
         */
        List<Integer> list2 = Arrays.asList(1,2,3,4,5,6);
        list2.stream().limit(5).skip(1).forEach(System.out::println);
    }
}

1.6 Stream的 sorted方法

排序

public class Stream_sorted {
    public static void main(String[] args) {
        /**
         * 需求:对元素进行排序
         */
        //默认是:升序
        List<Integer> list = Arrays.asList(3, 2, 1, 4, 5, 6);
        list.stream().sorted().forEach(System.out::println);
        //自定义排序规则
        list.stream().sorted((o1, o2)-> o2-o1).forEach(System.out::println);
    }
}

1.7 Stream的 distinct 方法

/**
 * 需求:去除重复元素
 */
public class Stream_distinct {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,1,2,2,4,5,6);
        //去重
        list.stream().distinct().forEach(System.out::println);
    }
}

1.8 将流重新转为集合

/**
 * 需求:过滤出集合中的非空字符串,并以集合返回
 */
public class Stream_Collectors_toLis{
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //过滤非空字符串,先打印看看
        strings.stream().filter(s->s.isEmpty()).forEach(System.out::println);
        //将过滤的结果转为集合:collect(Collectors.toList())
        List<String> collect = strings.stream()
                .filter(s->s.isEmpty())
                .collect(Collectors.toList());

        //其他方法
        List<String> stringss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //把过滤后的结果转为 逗号 拼接的字符串
        String collect1 = stringss.stream().filter(s -> s.isEmpty()).collect(Collectors.joining(","));
        //-------------------------
        List<String> stringsss = Arrays.asList("ii", "ss", "", "dd", "agt","", "12");
        //统计非空元素的个数
        long count = stringsss.stream().filter(s -> s.isEmpty()).count();

    }
}

我亦无他,惟手熟尔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别来无恙blwy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值