java8 Stream学习之旅

Stream
这篇文章将记录我慢慢学习Stream的过程
Stream 并行问题:
并行操作速度快 但是不保证安全性

int max = 1000_000;
        List<String> values;
        // 创建一个包含唯一元素的大容器:
        values = Arrays.asList("c", "a", "d", "a", "z", "f");

        long t0 = System.nanoTime();
        // 单线程所以慢 但是排序结果是对按照字典顺序
        values.stream().sorted().forEach(System.out::println);
        // 多线程 但是注意不安全 并发问题 注意这里按照字典逆序排序
//      values.stream().parallel().sorted(Comparator.reverseOrder());
        // 多线程 但是注意不安全 并发问题
//      values.parallelStream().sorted().forEach(System.out::println);
        //逆序排序
        values.stream().sorted(Comparator.reverseOrder());
        long t1 = System.nanoTime();

        long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0);
        System.out.println(String.format("parallel sort took: %d ms", millis));
        // parallel sort took: 1373 ms 并行排序所花费的时间大约是顺序排序的一半。

排序:

基本数据类型或者实现Comparable接口的类调用即可stream().sorted()
上面例子已经有部分 类排序

static class User implements Comparable<User>{
        String name;
        int age;
        public User(String name, int age) {
            super();
            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 "User [name=" + name + ", age=" + age + "]";
        }
        @Override
        public int compareTo(User o) {

            return this.age-o.age;
        }

    }


@SuppressWarnings("unchecked")
    public static void main(String[] args) {


        List<User> users =Arrays.asList(new User("张三", 1),new User("李斯特", 3),new User("李斯特", 3));
        users.stream().sorted().forEach(System.out::println);
    }

逆序

List<User> users =Arrays.asList(new User("张三", 1),new User("李斯特", 3),new User("李斯特", 3));
        users.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);

不在bean实现Comparable 比较

@SuppressWarnings("unchecked")
    public static void main(String[] args) {


        List<User> users =Arrays.asList(new User("a", 1),new User("b", 5),new User("c", 3));
        //按照bean中名字字典属性排序
        users.stream().sorted((name1,name)->name1.getName().compareTo(name.getName()) ).forEach(System.out::println);
    }
    static int a(){
        return 3;
    }
    static class User {
        String name;
        int age;
        public User(String name, int age) {
            super();
            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 "User [name=" + name + ", age=" + age + "]";
        }


    }
    List<User> users =Arrays.asList(new User("c", 1),new User("b", 5),new User("a", 3));
        //按照bean中名字字典属性排序
        users.stream().sorted(Comparator.comparing(new Function<User, String>() {

            @Override
            public String apply(User t) {
                // TODO Auto-generated method stub
                return t.getName();
            }

        })).forEach(System.out::println);
List<User> users =Arrays.asList(new User("c", 1),new User("b", 5),new User("a", 3));
        //按照bean中名字字典属性排序
        users.stream().sorted(Comparator.comparing(User::getName)).forEach(System.out::println);

        //按照bean中名字字典属性排序 逆序
                users.stream().sorted(Comparator.comparing(User::getName).reversed()).forEach(System.out::println);

reduce累加操作

    List<User> users =Arrays.asList(new User("c", 1),new User("b", 5),new User("a", 3));
        //按照bean中名字字典属性排序
//      users.stream().sorted(Comparator.comparing(User::getName)).forEach(System.out::println);

        //按照bean中名字字典属性排序 逆序
        User reduce = users.stream().sorted(Comparator.comparing(User::getName).reversed()).reduce(new User("xiao", 11), new BinaryOperator<TestMain.User>() {

            @Override
            public User apply(User t, User u) {

                System.out.println("t "+t.toString());
                System.out.println("u "+u.toString());
                t.setAge(t.getAge()+u.getAge());
                return t;
            }
        });
        //返回User [name=xiao, age=20]
        System.out.println(reduce);
@SuppressWarnings("unchecked")
    public static void main(String[] args) {


        List<User> users =Arrays.asList(new User("c", 1),new User("b", 5),new User("a", 3));
        //按照bean中名字字典属性排序
//      users.stream().sorted(Comparator.comparing(User::getName)).forEach(System.out::println);

        //按照bean中名字字典属性排序 逆序
        Optional<User> reduce = users.stream().sorted(Comparator.comparing(User::getName).reversed()).reduce( new BinaryOperator<TestMain.User>() {

            @Override
            public User apply(User t, User u) {

                System.out.println("t "+t.toString());
                System.out.println("u "+u.toString());
                t.setAge(t.getAge()+u.getAge());
                return t;
            }
        });
        //返回User [name=c, age=9]
        System.out.println(reduce.orElse(new User("李寿命",111)));
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值