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)));
}