Java LTS(长期支持版本),目前最新的有Java8,Java11,Java17。
今天来总结一下Java8版本中主要的新特性。供大家学习参考
- Lambda表达式
- Stream流 API
- Foreach 方法
- 日期时间API
- Noshorn JavaScript 引擎
- 方法引用
- StringJoiner
1.Lamba表达式
Lamba表达式是一个匿名的函数,可以通过像函数式编程的方式一样写代码。Lamba表达式能极大的简化我们的代码。
常见的写法:
不需要参数,返回10
()->10
传入一个参数,返回a的平方
(a)->a*a
传入两个参数,并且返回它们的和
(a,b)->a+b
没有返回值的
(s)->System.out.println(s)
最常见的就是创建线程的写法:
public static void main(String[] args) {
Runnable run1=new Runnable() {
@Override
public void run() {
System.out.println("thread1 is running!");
}
};
Runnable run2=()->{
System.out.println("thread2 is running!");
};
Thread t1=new Thread(run1);
Thread t2=new Thread(run2);
t1.start();
t2.start();
}
2. Stream流 API
Stream流API提供了数据过滤,提取,转换的方法。和之前的InputStream流完全没有关系,Stream流是对管道中数据的处理。Stream流的数据来自集合,数组,I/O channel,产生器generator等,简化了Java集合的编程。
常用的操作:
filter(lambda):从流中排除某些元素
distinct():从流中去除重复的元素
limit(long maxsize):截断流,只保留给定数量的元素
skip(long n)跳过元素,返回跳过的元素流
sorted():产生新的流,按照顺序排序
sorted(Comparator comp):按照给定的排序规则排序
toList():把流中的元素收集到List
toSet():把流中的元素收集到Set中
count():计算流中的个数
3.ForEach方法
为了迭代集合,Java8 在Iterable接口提供了一个新的ForEach方法,可以用来遍历元素集合。
public static void main(String[] args) {
List<String> fruits= Arrays.asList("苹果","香梨","香蕉");
fruits.forEach(System.out::println);
}
4.接口定义增加了Default方法
interface Moveable{
default void Sound(){
System.out.println("calling me");
}
}
public class LambdaExample {
public static void main(String[] args) {
//输出 calling me
new Moveable(){}.Sound();
}
}
5.日期时间API(JSR-310)
Java8增加了新的日期时间处理API,包含在java.time包中。
6.Nashorn JavaScript 引擎
Nashorn是一个JavaScript 引擎,用来动态的执行Javascript代码,可以通过jjs命令行工具来动态执行js脚本,或者加载进Java代码中执行。
7.方法引用
方法引用可以用在函数式编程中,应该算是lambda的一种子特性。方法可以被:
- 构造函数
- 静态方法
- 一个实例方法
引用。例如:
class ThreadExample{
public static String staticMethod(){
System.out.println("初始化线程");
return "Thread1";
}
}
public class LambdaExample {
public static void main(String[] args) {
//调用了ThreadExample类的静态staticMethod方法,返回一个字符串
Thread t=new Thread(ThreadExample::staticMethod);
t.start();
}
}
8.StringJoiner
用指定的连接字符串拼接字符串,例如
StringJoiner names = new StringJoiner("-"); //连接字符是 -
// 添加字符串,最终输出张三-李四
names.add("张三");
names.add("李四");
System.out.println(names.toString());