jdk 8新特性Stream

本文介绍Java8中的Stream API,演示如何使用Stream进行数据过滤、映射、统计等操作,并展示了如何将Stream结果转换为集合或数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚学完java8的新特性,留下demo做个记录

package com.demo.controller;

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

public class StreamDemo {
    public static void main(String[] args) {
        /**
         * 集合条件筛选出名字是三个字并且姓叶的
         */
        List<String> list = new ArrayList<>(10);
        list.add("张小凡");
        list.add("叶凡");
        list.add("帝释天");
        list.add("萧炎");
        list.add("林动");
        list.add("叶文");

        //传统写法
        for(String name :list){
            if(!name.isEmpty() && name.length() == 3 && name.startsWith("叶")){
                System.out.println(name);
            }
        }
        ///////////////////////////////////////////////////////////////////////////////////////////////
        /**Stream的更优写法
         *       1,三个字的
         *       2,姓叶的
         *       3打印
         * 流式处理思想:先找到三个字的 -> 再找到姓叶的 -> 分别进行打印
         */
        list.stream().filter(s ->s.length()==3).filter(s -> s.startsWith("叶")).forEach(System.out::println);

        /**
         * java   8 全新引入Stream Api核心接口:java.util.stream.Stream<T>
         *     获取流的三种常用方法
         *     1,通过collection,直接调用Stream()方法
         *     2,通过Map:并不是collection的子接口,而且期中是一对一对的,不能直接获取,间接转换成集合然后获取流
         *     3,通过数组,通过Arrays.stream方法(推荐使用这个,会自动识别哪种重载形式),或者Stream.of方法
         */
        //1
        Collection<String> collection = new ArrayList<>();
        collection.stream();

        //2
        Map<String,String> map = new HashMap<>();
        //获取所有的键对应的流
        Stream<String> streamKey = map.keySet().stream();
        //获取所有的流对应的值
        Stream<String> streamVal = map.values().stream();
        //获取所有键值对对应的流
        Stream<Map.Entry<String, String>> stream = map.entrySet().stream();

        //3
        String[] arry ={"大王","小王"};
        Stream<String> stream1 = Arrays.stream(arry);
        Stream<String> arry1 = Stream.of(arry);

     ///////////////////////////////////////////////////////////////////////////////////////////


    }
}

/**
 * 常用的Stream流的方法
 * filter过滤方法,参数必须是一个predicate接口实现(也就是能产生boolean结果的过虑规则)
 * 方法的调用会返回一个全新的Stream接口,原来的不变
 * Stream是一次性使用的,每次调用之后都会返回一个新的Stream接口实例
 */
class StreamFilterDemo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(10);
        list.add("张小凡");
        list.add("叶凡");
        list.add("叶无道");
        list.add("萧炎");
        list.add("林动");
        list.add("叶文");
        //获取流
        Stream<String> stream = list.stream();
        //参数必须是一个predicate(也就是能产生boolean结果的过虑规则)
//        Stream<String> result = stream.filter(s -> s.contains("叶"));
        //一个Stream只能使用唯一的一次,用后即销毁,所以两次调用会报错
//        Stream<String> result2 = stream.filter(s -> s.contains("叶"));
        //多个条件采用链式方法
        Stream<String> stringStream = stream.filter(s -> s.contains("叶")).filter(s -> s.length() == 2);
    }
}


/**
 * Count方法
 * 统计元素个数,返回的不是接口自身,而是原素个数
 */
class StreamCountDemo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(10);
        list.add("张小凡");
        list.add("叶凡");
        list.add("叶无道");
        list.add("萧炎");
        list.add("林动");
        list.add("叶文");
        //获取流
        Stream<String> stream = list.stream();
        long count = stream.filter(s -> s.length() ==2).count();
        System.out.println(count);
    }
}

/**
 * limit方法
 * 获取前n个元素
 *      参数:需要获取的元素个数(前几个)
 *      返回值:Stream接口
 */
class StreamLimitDemo{

    public static void main(String[] args) {
        List<String> list = new ArrayList<>(10);
        list.add("张小凡");
        list.add("叶凡");
        list.add("叶无道");
        list.add("萧炎");
        list.add("林动");
        list.add("叶文");
        //获取流
        Stream<String> stream = list.stream();
        //获取的是有序的前几个
        stream.limit(3).forEach(System.out::println);
    }
}


/**
 * Skip方法
 * 跳过前几个
 *      参数:需要跳过的参数个数
 *      返回值:Stream接口
 */
class StreamSkipDemo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(10);
        list.add("张小凡");
        list.add("叶凡");
        list.add("叶无道");
        list.add("萧炎");
        list.add("林动");
        list.add("叶文");
        //获取流
        Stream<String> stream = list.stream();
        //跳过前3个
        stream.skip(3).forEach(System.out::println);
    }

}


/**
 * Map方法,在流当中进行映射操作
 *      参数:是一个Function<T,R>接口
 *      返回值:Stream接口
 */
class StreamMapDemo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(10);
        list.add("10");
        list.add("20");
        list.add("30");
        list.add("40");
        list.add("50");
        list.add("60");

        //String转int
        list.stream().map(Integer::valueOf).forEach(System.out::println);

    }
}

/**
 * Concat 合并流方法
 * 注意:这个方法是Stream接口中的静态方法,可以静态调用
 */
class StreamConcatDemo{
    public static void main(String[] args) {
        String[] array1 = {"大", "中", "小"};
        String[] array2 = {"上", "中", "下"};
        //合并两个数组的元素
        Stream<String> streamArry1 = Stream.of(array1);
        Stream<String> streamArry2 = Stream.of(array2);
        Stream.concat(streamArry1,streamArry2).forEach(System.out::println);

    }
}

/**
 * ForEach方法 对流中元素进行逐一消费
 */
class StreamForEachDemo{

    public static void main(String[] args) {
        String[] array ={"上","下","左","右","中"};
        //第一种方法
        Stream.of(array).forEach(System.out::println);
        //第二种方法
        Stream.of(array).forEach(StreamForEachDemo::method);
    }

    public static void method(String str){
        System.out.println("测试2:"+str);
    }


}


/**
 * 获取并发的流(多线程执行)
 * 第一种方法:直接获取并发流 parallelStream
 * 第二种方法:先获取普通流再变成并流
 *
 */
class StreamP{
    public static void main(String[] args) {
        List<String> list =new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add("str:"+i);
        }
        //方法一:parallelStream
        list.parallelStream().forEach(System.out::println);
        //方法二:先获取普通流stream,再变成并发流parallel
        list.stream().parallel().forEach(System.out::println);
    }
}

/**
 * Stream收集结果转集合
 * 调用Collectors工具类的方法实现
 */
class StreamCollectDemo{
    public static void main(String[] args) {
        String[] array = {"哈哈","喔喔","哦哦"};
        //结果转list
        List<String> collect = Stream.of(array).collect(Collectors.toList());
        //结果转set
        Set<String> collect1 = Stream.of(array).collect(Collectors.toSet());
    }
}

/**
 * Stream结果转数组
 * toArray方法
 */
class StreamArrayDemo{
    public static void main(String[] args) {
        //方法一  这种写法返回的是一个object类型无法返回具体泛型
        Object[] objects = Stream.of("A", "B", "C").toArray();

        //方法二  返回指定类型的数组
        String[] strings = Stream.of("A", "B", "C").toArray(String[]::new);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值