一、简介
Java8(又称为jdk1.8)是Java语音开发的一个主要版本。
Java 8 是 oracle 公司于 2014 年 3 月发布,可以 看成是自 Java 5 以来最具革命性的版本 。 Java 8 为 Java 语言、编译器、类库、开发工具与 JVM 带来了大量新特性。
- 函数式接口
- Lambda表达式
- 方法引用/构造器引用
- Stream API (其中包括并行流和串行流)
- 接口的增强 (静态方法和默认方法)
- Optional类
- 新的时间和DateTime API
- 其他新特性
二、开始介绍
1.Lambda表达式
Lambda好处:简化匿名内部类的调用,使代码变得更加精简
Lambad演变过程
@Data @ToString @NoArgsConstructor @AllArgsConstructor public class Student { //名字 private String name; //性别 private String sex; //薪水 private int salary; //年龄 private int age; //星座 private String star; }View Code
1.1 普通筛选(将集合进行遍历,并依次判断)
@Test public void test1(){ //首先创建一个 List<Student> list = Arrays.asList( new Student("九天","男",5000,18,"天秤座"), new Student("十夜","男",4000,16,"双鱼座") ); List<Student> result = new ArrayList<>(); for (Student student:list){ if ("天秤座".equals(student.getStar())){ result.add(student); } } System.out.println(result); }普通筛选
1.2 匿名内部类筛选
public interface FilterProcess<T> { boolean process(T t); }公共接口
public List<Student> filterStudent(List<Student> students, FilterProcess<Student> mp){ List<Student> list = new ArrayList<>(); for (Student student : students) { if(mp.process(student)){ list.add(student); } } return list; }公共函数
@Test public void test2(){ List<Student> students = Arrays.asList( new Student("九天","男",5000,18,"天秤座"), new Student("十夜","男",4000,16,"双鱼座") ); List<Student> list = filterStudent(students, new FilterProcess<Student>() { @Override public boolean process(Student student) { return student.getStar().equals("天秤座"); } }); for (Student student : list) { System.out.println(student); } }匿名内部类
@Test public void test1() { List<Student> list = Arrays.asList( new Student("九天","男",5000,18,"天秤座"), new Student("十夜","男",4000,16,"双鱼座") ); list.stream().filter((e) -> e.getStar().equals("天秤座")) .forEach(System.out::println); }Lambad运行
2.Stream API
Stream API是JDK1.8中处理集合的关键抽象理念。Stream使用一种类似用SQL语音从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。
主要是将要处理的元素集合看做流,使其在管道中传输,并且可以在传输的节点上进行处理,如:筛选、排序等。
2.1 map 的key转换为list
@Test public void test3() { List<String> names = list.stream().map(Student::getName).collect(Collectors.toList()); names.stream().forEach(System.out::println); }转换为list
2.2 mapToInt 转换数值流
@Test public void test4() { IntStream intStream = list.stream().mapToInt(Student::getAge); Stream<Integer> integerStream = intStream.boxed(); Optional<Integer> max = integerStream.max(Integer::compareTo); System.out.println(max.get()); }数值流
2.3 flatMap合并为一个流
@Test public void test5() { List<String> list2 = new ArrayList<>(); list2.add("aaa bbb ccc"); list2.add("ddd eee fff"); list2.add("ggg hhh iii"); list2 = list2.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(Collectors.toList()); System.out.println(list2); }View Code
2.4 去重
@Test public void test6() { List<String> list2 = new ArrayList<>(); list2.add("aaa bbb ccc"); list2.add("ddd eee fff"); list2.add("ggg hhh iii"); list2.add("ggg hhh iii"); list2.stream().distinct().forEach(System.out::println); }View Code
2.5 sorted排序
@Test public void test7() { //asc排序 list.stream().sorted(Comparator.comparingInt(Student::getAge)).forEach(System.out::println); System.out.println("------------------------------------------------------------------"); //desc排序 list.stream().sorted(Comparator.comparingInt(Student::getAge).reversed()).forEach(System.out::println); }View Code
2.6 skip跳过(指跳过前几个,例skip(2),则跳过前两个)
@Test public void test8() { list.stream().skip(1).forEach(System.out::println); }View Code
2.7 limit截取
@Test public void test10() { list.stream().limit(1).forEach(System.out::println); }View Code
2.8 anyMatch(与其中任意一个条件符合)
@Test public void test11() { boolean isHave = list.stream().anyMatch(student -> student.getAge() == 16); System.out.println(isHave); }View Code
2.9 allMatch(全部符合)
@Test public void test12() { boolean isHave = list.stream().allMatch(student -> student.getAge() == 16); System.out.println(isHave); }View Code
2.10 noneMatch(是否满足没有符合的)
@Test public void test13() { boolean isHave = list.stream().noneMatch(student -> student.getAge() == 16); System.out.println(isHave); }View Code
2.11 findAny(找到其中一个元素,使用stream时找到的是第一个元素,使用paramStream并行时找到的是其中一个元素)
@Test public void test14() { Optional<Student> student = list.stream().findAny(); System.out.println(student.get()); }View Code
2.12 count 计数
@Test public void test17() { long count = list.stream().count(); System.out.println(count); }View Code
2.13 of(生成一个字符串流)
@Test public void test18() { Stream<String> stringStream = Stream.of("i","love","you"); }View Code
2.14 empty(生成一个空流)
@Test public void test19() { Stream<String> stringStream = Stream.empty(); }View Code
2.15 collect:averagingLong(求平均值)
@Test public void test1(){ // 求年龄平均值 Double average = list.stream().collect(Collectors.averagingLong(Student::getAge)); }View Code
2.16 reduce求和
例: User u = list.stream().reduce((u1, u2) -> new User("sum", u1.getAge() + u2.getAge())).get(); System.out.println(u); System.out.println("age sum->" + u.getAge()); }View Code
2.17 for循环
// stream For循环 @Test public void streamFor() { List<User> list = userList(); list.stream().forEach(u-> System.out.println(u)); }View Code
3.Date
优势:
1)不变性:新的日期/时间API中,所有类都是不可变的,对多线程环境有好处。
2)关注点分离:新的API将可读的日期和机器时间明确分离。
3)清晰:在所有的类中,方法都被明确定义用以完成相同的行为。
4)实用操作:所有新的日期/时间API类都实现了一系列方法用来完成通用的任务。
5)可扩展性:新的日期/时间API是工作在ISO-8601日历系统上的。
3.1 获取当前时间
Instant instant = Instant.now(); //获取当前时间戳 LocalDate localDate = LocalDate.now(); //获取当前日期 LocalTime localTime = LocalTime.now(); //获取当前时刻 LocalDateTime localDateTime = LocalDateTime.now(); //获取当前具体时间 ZonedDateTime zonedDateTime = ZonedDateTime.now(); //获取带有时区的时间View Code
3.2 时间戳转LocalDateTime
long timestamp = System.currentTimeMillis(); Instant instant = Instant.ofEpochMilli(timestamp); LocalDateTime.ofInstant(instant, ZoneId.systemDefault());View Code
3.3 LocalDateTime转时间戳
LocalDateTime dateTime = LocalDateTime.now(); dateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); dateTime.toInstant(ZoneOffset.of("+08:00")).toEpochMilli(); dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();View Code
参考自:https://blog.csdn.net/qq_25391785/article/details/123377399
标签:stream,list,System,特性,jdk8,println,public,out From: https://www.cnblogs.com/foredawn/p/16735410.html