Java 8 新特性

35 篇文章 1 订阅

 

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。

更多的新特性可以参阅官网:What's New in JDK 8

 

1、Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。

 

package exprience;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Java8Tester {

	 public static void main(String args[]){
		   
	      List<String> names1 = new ArrayList<String>();
	      names1.add("Google ");
	      names1.add("Runoob ");
	      names1.add("Taobao ");
	      names1.add("Baidu ");
	      names1.add("Sina ");
	        
	      List<String> names2 = new ArrayList<String>();
	      names2.add("Google ");
	      names2.add("Runoob ");
	      names2.add("Taobao ");
	      names2.add("Baidu ");
	      names2.add("Sina ");
	        
	      Java8Tester tester = new Java8Tester();
	      System.out.println("使用 Java 7 语法: ");
	        
	      tester.sortUsingJava7(names1);
	      System.out.println(names1);
	      System.out.println("使用 Java 8 语法: ");
	        
	      tester.sortUsingJava8(names2);
	      System.out.println(names2);
	   }
	   
	   // 使用 java 7 排序
	   private void sortUsingJava7(List<String> names){   
	      Collections.sort(names, new Comparator<String>() {
	         @Override
	         public int compare(String s1, String s2) {
	            return s1.compareTo(s2);
	         }
	      });
	   }
	   
	   // 使用 java 8 排序
	   private void sortUsingJava8(List<String> names){
	      Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
	   }
}
输出:
使用 Java 7 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]
使用 Java 8 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]

lambda表达式语法格式:

(parameters) -> expression

或
(parameters) -> {statements ;}

lambda表达式的重要特性:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。
//1.不要参数,返回值为5
() -> 5

//2.接收一个参数(数值类型),返回其2倍的值
x -> 2*x

//3.接收2个参数(数值类型),并返回他们的差
(x,y) -> x-y

//4.接收2个int 整数,返回他们的和
(int x,int y) -> x+y

//5.接收一个string对象,并打印,不返回类型,(void)
(string s) -> system.out.print(s)
package exprience;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.xml.ws.handler.MessageContext;

public class Java8Tester {

	   
	   // 使用 java 7 排序
	   private void sortUsingJava7(List<String> names){   
	      Collections.sort(names, new Comparator<String>() {
	         @Override
	         public int compare(String s1, String s2) {
	            return s1.compareTo(s2);
	         }
	      });
	   }
	   
	   // 使用 java 8 排序
	   private void sortUsingJava8(List<String> names){
	      Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
	   }
	   
	   
	 public static void main(String args[]){
		   
	      List<String> names1 = new ArrayList<String>();
	      names1.add("Google ");
	      names1.add("Runoob ");
	      names1.add("Taobao ");
	      names1.add("Baidu ");
	      names1.add("Sina ");
	        
	      List<String> names2 = new ArrayList<String>();
	      names2.add("Google ");
	      names2.add("Runoob ");
	      names2.add("Taobao ");
	      names2.add("Baidu ");
	      names2.add("Sina ");
	        
	      Java8Tester tester = new Java8Tester();
	      System.out.println("使用 Java 7 语法: ");
	        
	      tester.sortUsingJava7(names1);
	      System.out.println(names1);
	      System.out.println("使用 Java 8 语法: ");
	        
	      tester.sortUsingJava8(names2);
	      System.out.println(names2);
	      
	//-------------------------------------------      
	      
	      //类型声明
	      MathOperation addition = (int a, int b) -> a+b ;
	      
	      //不用类型声明
	      MathOperation subtraction = (a,b) -> a-b ;
	      
	      //大括号中的返回语句
	      MathOperation multiplication = (int a, int b) ->{return a*b ;} ;
	      
	      //没有大括号的返回语句
	      MathOperation division =(int a,int b) -> a/b ;
	      
	      System.out.println("10+5="+tester.operation(10, 5, addition));
	      System.out.println("10-5="+tester.operation(10, 5, subtraction));
	      System.out.println("10*5="+tester.operation(10, 5, multiplication));
	      System.out.println("10/5="+tester.operation(10, 5, division));
	      
	      //不用括号
	      GreetingService greetingService = message ->System.out.println("hello "+message);
	      
	      //用括号
	      GreetingService greetingService2 = (message) ->System.out.println("hello2 "+message);
	      
	      greetingService.sayMessage("Runoob");
	      greetingService2.sayMessage("Google");
	      
	      
	   }
	 
	   interface MathOperation {
		      int operationM(int a, int b);
		   }
	   
	   interface GreetingService  {
		      void sayMessage(String message);
	   }
	   
	   private int operation(int a, int b,MathOperation mathOperation) {
		   return mathOperation.operationM(a, b);
	}

}
输出:
使用 Java 7 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]
使用 Java 8 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]
10+5=15
10-5=5
10*5=50
10/5=2
hello Runoob
hello2 Google

使用 Lambda 表达式需要注意以下两点:

  • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
  • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

变量作用域

lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

 

Java 8 Optional 类

 

  1. Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
  2. Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
  3. Optional 类的引入很好的解决空指针异常。

 

推荐 菜鸟教程 文档 http://www.runoob.com/java/java8-optional-class.html

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值