JDK1.8新特性
JDK1.8新特性
一、Lambda表达式
lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码
通过匿名内部类实现函数式接口
- 格式:(parameters) -> expression或者(parameters) -> {statements}
- 不需声明参数类型,jvm会自动判断
- 一个参数无需小括号
- 一条语句无需大括号
- 只有一条语句,jvm会自动返回值
- 注意:
- lambda 表达式只能引用标记了 final 的外层局部变量,否则会编译错误
- lambda表达式的局部变量可以不用声明final,会自己生成
- 不可以声明一个局部变量同名的参数
- 格式:(parameters) -> expression或者(parameters) -> {statements}
二、函数式接口
- 只有一个抽象方法的接口
- 可以有多个非抽象的接口
- java1.8中所有的函数式接口
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
- java.util.function.*–java8新增,具体参考jdk1.8官方文档
三、默认方法
接口可以有实现方法,通过在方法名前面加default关键字
四、Stream API–使用
计算空字符串列表
1
2
3List<String> strings = Arrays.asList("abc","","bc","efg","abcd","","jkl");
count = strings.stream().filter(String::isEmpty).count();
System.out.println("空字符串有:"+count);字符串数量为3
1
2
3List<String> strings = Arrays.asList("abc","","bc","efg","abcd","","jkl");
count = strings.stream().filter(string -> string.length()==3).count();
System.out.println(count);删除空字符串
1
2List<String> filtered2 = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选后的列表: " + filtered2);删除空字符串,并用逗号把它们连接起来
1
2String join = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + join);获取列表元素平方数
1
2
3List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> collect = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
System.out.println("平方数列表: " + collect);获取最大,最小,和,平均数
1
2
3
4
5
6List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
IntSummaryStatistics stats = integers.stream().mapToInt(x -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());输出10个随机数
1
random.ints().limit(10).sorted().forEach(System.out::println);
并行处理
1
long count1 = strings.parallelStream().filter(String::isEmpty).count();
map
Reduce
五、ForkJoin框架
六、Optional类
详细参考jdk1.8文档
- Optional可以为null的容器对象。可以用isPresent()方法判断,用get()返回对象
- Optional是一个容器,可以保存类型T的值,或者保存null
- Optional类很好的解决了空指针的问题
七、新时间日期API
Local–简化日期时间的处理,没有时区的问题
- 获取当前时间日期
1
2
3
4
5
6
7
8
9
10
11// 获取当前的日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1: " + date1);
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);- 获取指定时间的日期
1
2
3
4
5
6
7
8
9
10LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);
LocalTime date4 = LocalTime.of(22, 15);
System.out.println("date4: " + date4);Zoned–通过制定的时区处理日期时间
获取当前时间日期
1
2
3
4
5
6
7
8ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当期时区: " + currentZone);
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HiAsia的小站!
评论