JDK1.8Streams API代码实现

User实体类:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

@Data
@AllArgsConstructor
@ToString
public class User {
    private String name;
    private int age;
}

测试类:



@SpringBootTest
class DemoApplicationTests {

    List<User> list = Arrays.asList(
            // name,age
            new User("张三", 11),
            new User("王五", 20),
            new User("王五", 91),
            new User("张三", 8),
            new User("李四", 44),
            new User("李四", 44),
            new User("李四", 44)
    );
    @Test
    void contextLoads() {
    }

    /**
     * forEach遍历
     */
    @Test
    public void testForEach(){
        // java 8 前
        System.out.println("java 8 前");
        for(User user: list){
            System.out.println(user);
        }
        // java 8 lambda
        System.out.println("java 8 lambda");
        list.forEach(user -> System.out.println(user));

        // java 8 stream lambda
        System.out.println("java 8 stream lambda");
        list.stream().forEach(user -> System.out.println(user));
    }

    /**
     * sorted对Stream中元素按指定规则进行排序
     */
    @Test
    public void testSort(){
        System.out.println("排序前");
        list.forEach(user -> System.out.println(user));
        System.out.println("排序后");
        System.out.println("java 8 前");
        Collections.sort(list, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getAge()-o2.getAge();
            }
        });
        for (User user : list) {
            System.out.println(user);
        }
        System.out.println("java 8 stream 方法引用");
        list.stream().sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));//从小到大排序
        list.stream().sorted(Comparator.comparing(User::getAge).reversed()).forEach(user -> System.out.println(user));//从大到小排序
    }

    @Test
    public void testFilter(){
        System.out.println("过滤前");
        list.forEach(user -> System.out.println(user));
        System.out.println("过滤后");
        System.out.println("java前");
        for (User user : list) {
            if(user.getAge()>50){
                System.out.println(user);
            }
        }
        System.out.println("java 8 stream");
        list.stream().filter(user -> user.getAge()>50).forEach(user -> System.out.println(user));
    }

    /**
     * 从Stream中获取指定数量的元素
     */
    @Test
    public void testLimit(){
        System.out.println("截断前");
        list.forEach(user -> System.out.println(user));
        System.out.println("截断后");
        System.out.println("java 8 前");
        for(int i=0;i<3;i++){
            System.out.println(list.get(i));
        }
        System.out.println("java 8 stream");
        list.stream().limit(3).forEach(user -> System.out.println(user));
    }

    /**
     * skip 跳过.
     */
    @Test
    public void testSkip() {
        // 跳过前三个元素,从第四个开始输出
        System.out.println("-----跳过前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----跳过后-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 3; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        // java 8 stream
        System.out.println("java 8 stream");
        list.stream().skip(3).forEach(user -> System.out.println(user));
    }
    /**
     * distinct 去重.
     */
    @Test
    public void testDistinct() {
        // 因为Arrays.asList() 返回的是Arrays的内部类ArrayList,操作remove,add会报错
        List<User> users = new ArrayList(list);
        // 为list去除重复数据
        System.out.println("-----去重前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----去重后-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 0; i < users.size() - 1; i++) {
            for (int j = users.size() - 1; j > i; j--) {
                if (users.get(j).getAge() == users.get(i).getAge() && users.get(j).getName()
                        .equals(users.get(i).getName())) {
                    users.remove(i);
                }
            }
        }
        for (User user : users) {
            System.out.println(user);
        }
        // java 8 stream
        System.out.println("java 8 stream");
        users.stream().distinct().forEach(user -> System.out.println(user));
    }

    /**
     * 去重+按照年龄大于40以后从小到大+只取前二
     */
    @Test
    public void demo(){
        list.stream().distinct().filter(user -> user.getAge()>40).limit(2).sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));
    }

    /**
     * 测试计算.
     */
    @Test
    public void testNum(){
        IntSummaryStatistics num = list.stream().mapToInt(user -> user.getAge())
                .summaryStatistics();
        System.out.println("总共人数:"+num.getCount());
        System.out.println("平均年龄:" + num.getAverage());
        System.out.println("最大年龄:" + num.getMax());
        System.out.println("最小年龄:" + num.getMin());
        System.out.println("年龄之和:" + num.getSum());
    }
    /**
     * map映射
     */
    @Test
    public void testMap(){
        //只要输出所有人的年龄
        list.stream().forEach(user -> System.out.println(user));
        System.out.println("映射后");
        List<Integer> ages= list.stream().map(user -> user.getAge()).collect(toList());
        ages.forEach(age -> System.out.println(age));
        //小写转大写
        List<String>words = Arrays.asList("aaa","vvvv","cccc");
        System.out.println("全部大写----》");
        List<String>collect = words.stream().map(s ->s.toUpperCase()).collect(toList());
        collect.forEach(s -> System.out.println(s));
    }

    /**
     * flatMap
     */
    @Test
    public void testFlatMap(){
        //创建一个 装有两个泛型为integer的集合

        Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));
        //将两个合成一个
        Stream<Integer> integerStream = stream.flatMap((Function<List<Integer>,Stream<Integer>>)
                integers ->integers.stream());
        //为新的集合
        List<Integer> collect = integerStream.collect(toList());
        System.out.println("新stream大小:"+collect.size());
        System.out.println("-----合并后-----");
        collect.forEach(o -> System.out.println(o));
    }
    /**
     * findFirst
     */
    @Test
    public void testFindFist(){
        User user = list.stream().findFirst().get();
        System.out.println(user);
    }

    /**
     * reduce操作可以实现从一组元素中生成一个值
     */
    @Test
    public void reduce(){
        Optional<User>max = list.stream().reduce((s1,s2) ->s1.getAge() >s2.getAge() ?s1:s2);
        User user = max.get();
        System.out.println(user);
        // 求年龄之和
        Integer reduce = list.stream().reduce(0, // 该参数为初始值
                (integer, user1) -> integer + user1.getAge(), // 该参数为累加器,新元素如何累加
                (integer, integer2) -> integer + integer2);// 多个部分如何合并
        System.out.println(reduce);

    }
    /**
     * collect
     * 引用静态方法	Integer::sum
     * 引用某个对象的方法	list::add
     * 引用某个类的方法	String::length
     * 引用构造方法	HashMap::new
     */
    @Test
    public void collect(){
        // 将Stream转换成List或Set
        Stream<String> stream = Stream.of("I", "love", "you", "too");
        //List<String> list = stream.collect(Collectors.toList());
        //Set<String> set = stream.collect(Collectors.toSet());

        // 使用toCollection()指定规约容器的类型
        //ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));
        //HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));

        // 使用Collectors.joining()拼接字符串
        //String joined = stream.collect(Collectors.joining());// "Iloveyoutoo"
        //String joined = stream.collect(Collectors.joining(","));// "I,love,you,too"
        String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you,too}"
        System.out.println(joined);
    }
}
发布了29 篇原创文章 · 获赞 8 · 访问量 908

猜你喜欢

转载自blog.csdn.net/qq_38650808/article/details/103511216