java8 Stream学习之旅

    xiaoxiao2021-12-14  23

    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))); }
    转载请注明原文地址: https://ju.6miu.com/read-970767.html

    最新回复(0)