Java8新特性
1 Lambda 表达式
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
以下是lambda表达式的重要特征:
1 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
2 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
3 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
4 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量(因为内部无法识别2个变量)。
简单实例:
public class LambdaTest {
String classVar = "hello ";
public static void main(String[] args) {
LambdaTest tester = new LambdaTest();
// 类型声明
MathOperation addition = (int a, int b) -> a + b;
MathOperation sub = (int a, int b) -> a - b;
System.out.println("10 + 5 = " + addition.operation(5,10));
System.out.println("15 - 10 = " + sub.operation(15,10));
String pre = "你好! ";
/**
*只能访问main方法内的成员变量pre,且pre必须为final或者程序后面不再对pre值做修改(隐形final)
*如果要访问类成员变量classVar,需要把成员变量定义为static
*/
SayHello sayHello = message -> System.out.println(pre + message);
sayHello.say("小榕先生");
}
//接口定义
interface MathOperation {
int operation(int a, int b);
}
//接口定义
interface SayHello {
void say(String name);
}
}
Lambda 表达式的使用前提:
必须有接口(不能是抽象类),接口中有且仅有一个需要被重写的抽象方法。
必须支持上下文推导,要能够推导出来 Lambda 表达式表示的是哪个接口中的内容。
2 方法引用
通过【类名::方法名】来进行使用
或【对象:方法名】来进行使用
![]()
3 函数式接口
4 默认方法
interface B{
void printHelloB(String name);
default void printHelloB2(String name){
System.out.println("helloB2 " + name);
}
}
通过default声明,使接口类可以有实现方法,他的实现着不需要再必须重写这个方法。
如果继承的多个接口,且有相同方法,则必须重写,否则编译器不知道使用哪儿个接口的默认方法
5 Stream
通过集合.stream()来获取流,如list.stream().XXXX
Stream(流)是一个来自数据源的元素队列并支持聚合操作.中间操作都会返回流对象本身,所以可以进行串联动作
通过lambda表达式来对流进行操作
1,numbers = new ArrayList(); numbers.stream().map( i -> i*i) //map对流内的元素进行改变,此处为流内元素变为本身的平方
2,strings.stream().filter(string -> string.isEmpty()).count();//filter 对集合进行过滤操作
3,random.ints().limit(10).forEach(System.out::println);//limit 限制接下来要操作的元素
4,random.ints().limit(10).sorted().forEach(System.out::println);//对流进行排序,sorted里面可以用lambda表达式来进行排序的改写
5,Collectors 可用于返回列表或字符串
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
6,统计int类型的集合
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
通过stats.getMax(),stats.getMin()等统计最大小值平均值等..
6 Optional 类
//感觉没啥太大用处,不做笔记
7 Nashorn, JavaScript 引擎
//java和script的互调,公司内部强调前后台分离,故也不做笔记
PS:既然是java8推出的,那肯定是有他的道理和作用的,只是本人暂时没法用
8 新的日期时间 API
java.time.*;修复jdk之前的非线程安全、时区及设计混乱的问题
1.对时间的处理变得更简单
2.增加了对时区的处理
暂时没用到,不做笔记
9 Base64编码
Base64.Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
Base64.getUrlEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
通过Base64调用其提供的静态方法对字符串进行编码和解码



浙公网安备 33010602011771号