Stream:类似于集合,只不过集合是存数据的; Stream只是操作中间过程
Stream使用:
1.创建Stream
2.Stream的中间操作过程
3.Stream的终止操作: 遍历
1.Stream的创建:
1.通过List集合获取Stream对象
单线程流--有序
//1.通过List集合获取Stream对象
List<String> list = new ArrayList<String>();
list.add("zs");
list.add("ls");
list.add("ww");
//单线程流--有序
list.stream().forEach(System.out::println);
System.out.println("--------------");
//多线程流--无序
list.parallelStream().forEach(System.out::println);
//Arrays方式创建Stream
Arrays.stream(new int[]{1,3,2}).forEach(System.out::println);
//Stream接口的of方法创建
Stream.of("aa","cc","bb").forEach(System.out::println);
//Stream接口的iterate方法创建: 迭代(参数1:初始值 参数2:在当前值基础上的迭代)
//limit(4):中间过程,限制多少个
Stream.iterate(2, t->t+1).limit(4).forEach(System.out::println);
//Stream接口的generate方法创建
System.out.println("-----");
Stream.generate(()->new Random().nextInt(6)).limit(3).forEach(System.out::println);
//IntStream的of,range,rangeClosed
System.out.println("====of===");
IntStream.of(3,5,8).forEach(System.out::println);
System.out.println("====range:开区间,不包括最后一个===");
IntStream.range(3, 6).forEach(System.out::println);
System.out.println("====range:闭区间,包括最后一个===");
IntStream.rangeClosed(3, 6).forEach(System.out::println);
1.2.Stream的过程操作
System.out.println("filter:过滤");
list.stream().filter(p->p.getAge()>=35).forEach(System.out::println);
System.out.println("limit:限制");
list.stream().limit(3).forEach(System.out::println);
System.out.println("skip:跳过");
list.stream().skip(1).forEach(System.out::println);
System.out.println("distinct:去重--需重写hashCode和equals");
list.stream().distinct().forEach(System.out::println);
System.out.println("sorted:排序");
list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).forEach(System.out::println);
System.out.println("map:映射");
list.stream().map(p->p.getName()).forEach(System.out::println);
System.out.println("parallel:多线程操作");
list.stream().parallel().forEach(System.out::println);
}
1.3.Stream终止操作
终止操作:
获取到Stream的最终结果
System.out.println("min:求最小值");
System.out.println(list.stream().min((o1,o2)->o1.getAge()-o2.getAge()));
System.out.println("max:求最大值");
System.out.println(list.stream().max((o1,o2)->o1.getAge()-o2.getAge()));
System.out.println("count:求个数");
System.out.println(list.stream().count());
System.out.println("reduce:汇总,先映射成age累加");
System.out.println(list.stream().map(p->p.getAge()).reduce((a1,a2)->a1+a2).get());
System.out.println("collect: 转其他集合输出");
System.out.println(list.stream().collect(Collectors.toSet()));
2. 新的日期类
2.1 日期类获取
本地日期类: LocalDate,LocalTime,LocalDateTime
场景:在单线程中我们可以直接使用Date即可;在多线中Date不具备安全性,所以需要使用本地日期
Instant: 时间戳 与时区有关,和本地时间差8小时
LocalDate localDate = LocalDate.now();//本地日期
LocalTime localTime = LocalTime.now();//本地时间
LocalDateTime localDateTime = LocalDateTime.now();//本地日期与时间
Instant instant = Instant.now(); //时间戳
ZoneId zoneId = ZoneId.systemDefault();//当前时区
2.2 日期类的转换
Date-->Instant--->LocalDateTime
LocalDateTime-->Instant-->Date
Date date = new Date();
//Date-->Instant
Instant instant = date.toInstant();
System.out.println("date转Instant:"+instant);
//Instant-->LocalDateTime
LocalDateTime ldt = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("Instant转LocalDateTime:"+ldt);
//LocalDateTime-->Instant
Instant instant2 = ldt.atZone(ZoneId.systemDefault()).toInstant();
System.out.println("LocalDateTime转Instant:"+instant2);
//Instant-->Date
System.out.println("Instant转Date:"+Date.from(instant2));
//本地日期格式类
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
//日期格式转出来是字符串类型
System.out.println(dtf.format(LocalDateTime.now()));