当前位置: 首页 > news >正文

java8、9新特性

JAVA8

Lambda 表达式

(parameters) -> expression

(parameters) ->{ statements; }

提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。
它允许将函数当作参数传递给方法,或者将函数作为返回值,这种支持使得 Java 在函数式编程方面更为灵活,能够更好地处理集合操作、并行计算等任务。

// 传统的匿名内部类
Runnable runnable1 = new Runnable() {@Overridepublic void run() {System.out.println("Hello World!");}
};// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello World!");

方法引用

构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );

静态方法引用:它的语法是Class::static_method,实例如下:

cars.forEach( Car::collide );

特定类的任意对象的方法引用:它的语法是Class::method实例如下:

cars.forEach( Car::repair );

特定对象的方法引用:它的语法是instance::method实例如下:

final Car police = Car.create( Car::new );
cars.forEach( police::follow );

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:

@FunctionalInterface
interface GreetingService 
{void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;public class Java8Tester {public static void main(String args[]){List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);// Predicate<Integer> predicate = n -> true// n 是一个参数传递到 Predicate 接口的 test 方法// n 如果存在则 test 方法返回 trueSystem.out.println("输出所有数据:");// 传递参数 neval(list, n->true);// Predicate<Integer> predicate1 = n -> n%2 == 0// n 是一个参数传递到 Predicate 接口的 test 方法// 如果 n%2 为 0 test 方法返回 trueSystem.out.println("输出所有偶数:");eval(list, n-> n%2 == 0 );// Predicate<Integer> predicate2 = n -> n > 3// n 是一个参数传递到 Predicate 接口的 test 方法// 如果 n 大于 3 test 方法返回 trueSystem.out.println("输出大于 3 的所有数字:");eval(list, n-> n > 3 );}public static void eval(List<Integer> list, Predicate<Integer> predicate) {for(Integer n: list) {if(predicate.test(n)) {System.out.println(n + " ");}}}
}

以上这个示例代表 使用n->true 实现Predicate<Integer> predicate的接口函数,此函数返回值作为eval方法的第二个参数,参与下面方法体的执行。

Java 8 接口默认方法

默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个 default 关键字即可实现默认方法。加static实现静态方法。
即不需要定义这个接口的实现类就可以直接使用该接口的方法

Stream流

数据源:集合,数组,I/O channel, 产生器generator 等
聚合操作:类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

生成流:

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。

Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

日期API

java.time包 LocalDate/LocalTime/LocalDateTime 和 ZonedDateTime

   // 获取当前的日期时间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);LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);System.out.println("date2: " + date2);// 12 december 2014LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);System.out.println("date3: " + date3);// 22 小时 15 分钟LocalTime date4 = LocalTime.of(22, 15);System.out.println("date4: " + date4);// 解析字符串LocalTime date5 = LocalTime.parse("20:15:30");System.out.println("date5: " + date5);}// 获取当前时区时间日期ZonedDateTime 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);

Optional 类 Nashorn, JavaScript 引擎 Base64

JAVA9

Stream API

takeWhile 方法

default Stream<T> takeWhile(Predicate<? super T> predicate)

takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。
takeWhile() 方法在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的元素的子集。

import java.util.stream.Stream;public class Tester {public static void main(String[] args) {Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty()).forEach(System.out::print);      } 
}

dropWhile 方法
和 takeWhile 作用相反的,使用一个断言作为参数,直到断言语句第一次返回 false 才返回给定 Stream 的子集。

iterate 方法

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

方法允许使用初始种子值创建顺序(可能是无限)流,并迭代应用指定的下一个方法。 当指定的 hasNext 的 predicate 返回 false 时,迭代停止。

java.util.stream.IntStream;public class Tester {public static void main(String[] args) {IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);} 
}

ofNullable 方法

static <T> Stream<T> ofNullable(T t)

ofNullable 方法可以预防 NullPointerExceptions 异常, 可以通过检查流来避免 null 值。
如果指定元素为非 null,则获取一个元素并生成单个元素流,元素为 null 则返回一个空流。

集合工厂方法

新方法创建集合
Java 9 中,以下方法被添加到 List,Set 和 Map 接口以及它们的重载对象。

static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E>  of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

私有接口方法

在 Java 9 中,一个接口中能定义如下几种变量/方法:
常量
抽象方法 abstract(不写方法体)
默认方法 default
静态方法 static
私有方法 private
私有静态方法 private static

进程API

ProcessHandle 接口来增强 java.lang.Process 类对本地进程的支持

http://www.lryc.cn/news/534898.html

相关文章:

  • 作业:zuoye
  • redis底层数据结构——链表
  • 问题解决 4S 法
  • SQL-leetcode—1407. 排名靠前的旅行者
  • 机器学习(李宏毅)——Transformer
  • React进阶之React状态管理CRA
  • 攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
  • 前端开发环境
  • Web自动化测试—测试用例流程设计
  • HTML全局属性与Meta元信息详解:优化网页的灵魂
  • day001 折半查找/二分查找
  • Linux 资源监控:优化与跟踪系统性能
  • java安全中的类加载
  • Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
  • 分布式服务框架 如何设计一个更合理的协议
  • Unity使用iTextSharp导出PDF-02基础结构及设置中文字体
  • Kafka因文件句柄数过多导致挂掉的排查与解决
  • 【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离
  • PRC框架-Dubbo
  • 智能检测摄像头模块在客流统计中的应用
  • [LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别
  • 【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS
  • 在JVM的栈(虚拟机栈)中,除了栈帧(Stack Frame)还有什么?
  • # 解析Excel文件:处理Excel xlsx file not supported错误 [特殊字符]
  • 图片下载不下来?即便点了另存为也无法下载?两种方法教你百分之百下载下来
  • Unity项目实战-Player玩家控制脚本实现
  • CP AUTOSAR标准之ICUDriver(AUTOSAR_SWS_ICUDriver)(更新中……)
  • Python3 ImportError: cannot import name ‘XXX‘ from ‘XXX‘
  • [学习笔记] Kotlin Compose-Multiplatform
  • 【R语言】t检验