JDK 8以上新特性
2023-05-10 21:58:36 12 举报
AI智能生成
登录查看完整内容
jdk 8 以上新特性
作者其他创作
大纲/内容
左边 容器(类名/实例名):: 右边对应的方法名 Student::getAge
语法
方法与构造方法引用 ::
本质:匿名内部类
() -> {}:用lambda表达式实现Runnable
(T) ->{}; 使用Java 8 lambda表达式进行事件处理
forEach() 使用lambda表达式对列表进行迭代
filter() 使用lambda表达式和函数式接口Predicate
map() Java 8中使用lambda表达式的Map
reduce() Java 8中使用lambda表达式的Reduce
计算集合元素的最大值、最小值、总和以及平均值
Lambda 表达式
of 函数 快速创建 stream
map 函数 将流中的每一个元素映射成R(类似 类型转换)
filter 函数 通过设置条件过滤元素
list.stream().sorted().collect(Collectors.toList());
sorted 函数 排序 默认升序
获取排第一的元素list.stream().limit(1).collect(Collectors.toList());
limit 函数 截断流
allmatch 和 anymatch 函数
max 和 min 函数的使用
list.parallelStream().forEach(System.out::println);
parallelStream 并行流的使用
源码:Optional<T> reduce(BinaryOperator<T> accumulator);
reduce 聚合函数的使用
源码:default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
list.forEach(System.out::println);
注意点: 1、不能修改循环外部的变量值 2、不能使用break、return、continue等结束和跳过循环
foreach 遍历函数
集合框架 stream 流的使用
Set<String> stringSet = list.stream().collect(Collectors.toCollection(TreeSet::new));
list.stream().collect(Collectors.toSet());
collect 收集方法
以“_”分隔符 连接 String stringSet = list.stream().collect(Collectors.joining("_"));
joining 函数
partitioningBy 函数 条件分组
groupingBy 分组函数
counting 分组进阶 统计
summarizingInt
summarizingDouble
summarizingLong
summarizing 统计函数
收集器和集合统计
求两集合的交集
//交集 List<VideoOrder> videoOrders = list1.stream().filter(list2::contains).collect(Collectors.toList()); //差集 List<VideoOrder> orders = list1.stream().filter(obj -> !list2.contains(obj)).collect(Collectors.toList());
求两集合的差集
List<VideoOrder> collect = list1.parallelStream().collect(Collectors.toList()); collect.addAll(list2);
求两集合的并集
List<VideoOrder> collect = list1.parallelStream().collect(Collectors.toList()); collect.addAll(list2); List<VideoOrder> distinct = collect.parallelStream().distinct().collect(Collectors.toList());
求两集合的去重并集
金额平均值: Double aDouble = list1.stream().collect(Collectors.averagingInt(VideoOrder::getMoney));
求两集合平均值
long sum = list1 .stream().collect(Collectors.summarizingInt(VideoOrder::getMoney)).getSum(); Integer final collect1 = list1 .stream().collect(Collectors.summingInt(VideoOrder::getMoney));
求两集合的某属性和
小小思维练习
工具 jshell
接口新增私有方法:jdk 8新增 静态+默认方法 静态方法是不能被实现类或接口继承的 而9中private方法也不能
public interface testjdk { void fun(); private void fun3(){ }}
注意:(面试题)<br> ==接口中的静态方法不能被实现类或子接口继承非静态的default方法可以<br> 类中的静态方法可以被继承==
接口新增私有方法
可以在外部声明 会自动关闭流``` void test(String filePath) { OutputStream out1 = new FileOutputStream(filePath); OutputStream out2 = new FileOutputStream(filePath); try (out1;out2){ outputStream.write("测试输出流".getBytes()); } catch (IOException e) { e.printStackTrace(); } }
jdk 9的增强 try-with-resource
1、什么叫只读集合? —— 只能读取不能写入或删除元素
jdk 9 之快速创建只读集合
JDK 9的一些新特性
```for(var i =0;i<10;i++){ }for(var obj:list){ }var flag = Boolean.valueOf("true");
注:仅适用于局部变量,如增强for循环索引 传统for循环局部变量<br> 不能作为方法形参,构造方法形参,方法返回类型 或者任何类型的变量声明<br> 标识符var不是关键字 只是一个保留类型名称<br>
jdk 10增加局部变量推断 var
jdk 11新增 HttpClient 客户端
JDK 10,11的新特性
旧写法: private static void test(String filepath) { OutputStream outputStream = new FileOutputStream(filepath); try { outputStream.write("测试输出流".getBytes()); } catch (IOException e) { e.printStackTrace(); }finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } }}
新写法: private static void test(String filepath) { try ( OutputStream outputStream = new FileOutputStream(filepath);){ outputStream.write("测试输出流".getBytes()); } catch (IOException e) { e.printStackTrace(); } }
文件流异常处理 try-with-resource (jdk 7的新特性)
oracle-Sun Hotspot、oracle jrockit、IBM J9、Taobao JVM
虚拟机类别 版本
Java.lang.OutOfMemoryError:PermGen space 永久空间不够 类太多导致 内存空间不够
原因: JDK 8之前的永久空间 用来存储class和mate信息 而永久空间大小不仅和内存大小有关 还需要使用指令XX:MaxPermSize 来设定这块区域大小
修复: JDK 8取消了 永久代空间 使用了本地内存存储元数据信息 所以默认matespace 大小和本地内存大小有关 初始值 是 20.8M 大小
虚拟机方面 OON 永久代空间问题
jstat -gc pid Linux命令MC: matespace capatity 总大小MU:matespace utilization 已使用大小
查询 Java程序大小
一些关于元数据查询命令
*新内存空间 Matespace(只有Hotspot版本虚拟机有此新特性)
Optional<T > optionalInteger = Optional.of(T value);
源码分析: public static <T> Optional<T> of(T value) { return new Optional<>(value); }
of(T values); values not null
Optional<Integer> optionalInteger = Optional.ofNullable(integer);
源码分析: public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } public static<T> Optional<T> empty() { @SuppressWarnings ("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } private static final Optional<?> EMPTY = new Optional<>();
ofNullable(T value);value nullable
Optional<T > optionalInteger = Optional.of(T value); Integer integer1 = optionalInteger.get();
源码分析: public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; }
访问opt对象的值 get();
Integer integer = null;Integer integer1 = 1;Integer i = Optional.ofNullable(integer).orElse(integer1);
student student = null;Integer i = Optional.ofNullable(student).map(obj ->obj::getage())).orElse(6);如果map获取对象数值失败 则获取orelse()兜底数据 6
源码分析: public T orElse(T other) { return value != null ? value : other; }
兜底方法 orElse(T valu);
源码分析: public boolean isPresent() { return value != null; }
isPresent 判断是否为空方法
源码分析: public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); }
ifPresent 如果是空
Optional类
LocalDate
LocalDateTime localDateTime = LocalDateTime.now(); 实例化
String localDateTime.format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:MM:SS\")); 格式化
int month = localDateTime.getDayOfMonth(); DayOfWeek week = localDateTime.getDayOfWeek(); int year = localDateTime.getDayOfYear(); int hour = localDateTime.getHour(); int minute = localDateTime.getMinute();
将LocalDateTime转为自定义的时间格式的字符串
将long类型的timestamp转为LocalDateTime
public static long getTimestampOfDateTime(LocalDateTime localDateTime) { ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); return instant.toEpochMilli();}
将LocalDateTime转为long类型的timestamp
将某时间字符串转为自定义时间格式的LocalDateTime
LocalDateTime
LocalTime
时间处理类
Base64.Encode encode = Base64.getEncode(); 加密
Base64.Decode Decode = Base64.getDecode(); 解密
新增 base 64加解密API
接口内部可以有default方法实现
接口加入 default 关键字
*HashMap的底层实现是一个哈希表即数组+链表;*HashMap初始容量大小16,扩容因子为0.75,扩容倍数为2;HashMap本质是一个一定长度的数组,数组中存放的是链表。
旧版本结构
由此可以看出 hash由原来的hash数组+链表变成了 数组+红黑树 和链表混合模式 但是实际应用是不存在这种情况的 因为hashmap早就扩容了
新版本结构
hashmap 新结构
JDK 8及以上的新特性
0 条评论
回复 删除
下一页