java 8 新特性(一)之 Lambda表達式初體驗


  最近在工做中看到同事在用java8新特性,今天就給你們帶來java8新特性的一些簡要介紹,若有不足,敬請指正。java

1、java8新特性簡介

  1. Lambda表達式
  2. 函數式接口
  3. 方法引用與構造器引用
  4. Stream API
  5. 接口中的默認方法與靜態方法
  6. 新時間日期API
  7. 其餘特性

  在數據結構這塊,好比java8對HashMap進行了優化,在之前的基礎上加入了紅黑樹,速度更快,提升了效率。最大化減小空指針異常 Optional,在內存這塊也作了優化處理,感興趣的小夥伴能夠詳細瞭解下。這裏再也不贅述。數據結構


  其中最重要的仍是咱們的Lambda表達式Stream APIide

2、入門小案例

  先來體會一下Lambda表達式和Stream API:咱們在開發過程當中常常遇到這樣的需求:找出年齡大於20歲的對象。使用了Lambda表達式Stream API後能夠極大減小代碼量。提升開發效率。函數

實體類

package com.rrss.test;

/**
 * @author lzx
 *
 * 實體類
 */
public class People {

	private String name;

	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public People() {
		super();
	}

	public People(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "People [name=" + name + ", age=" + age + "]";
	}

}

測試類

package com.rrss.test;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

/**
 * @author lzx
 *
 */
public class LambdaTest {

	@Test
	public void testLambda() {
		List<People> peoples = Arrays.asList(
				new People("張三", 18),
				new People("李四", 25),
				new People("王五", 30)
				);
		
		//找出年齡大於20的對象
		peoples.stream()
				.filter((t) ->t.getAge()>20)
				.forEach(System.out::println);
		
		System.out.println("------華麗分割線------");
		
		//找出全部對象的名字
		peoples.stream()
				.map(People::getName)
				.forEach(System.out::println);
	}

}
測試結果
  由此看出Lambda表達式和Stream ApI 是很強大的,減小不少的冗餘代碼。

  接下來咱們來詳解Lambda表達式測試


3、Lambda表達式優化

  下面咱們來詳細介紹Lambda表達式基礎語法。this

  須要注意的是,Lambda表達式須要函數式接口的支持。3d

3.1 什麼是函數式接口

  函數式接口:接口中只有一個抽象方法的接口稱爲函數式接口。咱們能夠用@FunctionalInterface來修飾接口,檢查接口是不是函數式接口。指針

package com.rrss.test;

/**
 * @author lzx
 *
 */
@FunctionalInterface
public interface LambdaInterface {

	void show(int name);

}

  以上就是一個函數式接口,若是在此接口中繼續增長抽象方法則會報錯(@FunctionalInterface來修飾)。code

3.2 基礎語法

  在java8中引入了一個新的操做符「->」,稱爲箭頭操做符或者Lambda操做符,此符號將表達式拆分紅兩部分。

  左側部分爲Lambda表達式參數列表,右側部分爲表達式中須要執行的功能

語法1、無參數,無返回值

package com.rrss.test;

import org.junit.Test;

/**
 * @author lzx
 *
 */
public class LambdaGrammer {

	@Test
	public void test1() {

		// 以前寫法
		Runnable r1 = new Runnable() {

			@Override
			public void run() {
				System.out.println("Hello World");
			}
		};

		r1.run();

		// Lambda表達式
		Runnable r = () -> System.out.println("Hello Lambda");
		r.run();
	}

}
執行結果

語法2、有參數(1個),無返回值

先看Consumer接口
@Test
	public void test2() {

		Consumer<String> consumer = (x) -> System.out.println(x);

		consumer.accept("Hello world");
	}
測試結果

語法3、如有參數(1個),小括號可省略不寫

@Test
	public void test3() {
		
		Consumer<String> consumer = x -> System.out.println(x);
		consumer.accept("Hello world");
		
	}
測試結果

語法4、參數2個以上,有返回值,有多條語句

@Test
	public void test4() {

		Comparator<Integer> comparable = (x, y) -> {
			System.out.println("語法4");
			return Integer.compare(x, y);
		};

	}

語法5、Lambda體中只有一條語句,return和大括號均可以省略不寫

@Test
	public void test5() {

		Comparator<Integer> comparable = (x, y) -> Integer.compare(x, y);
	}

語法6、Lambda表達式中的參數列表的數據類型能夠省略不寫,JVM會坐類型推斷

3.3 應用:對一個數進行運算

  • 自定義一個接口
package com.rrss.test;

/**
 * @author lzx
 *
 */
@FunctionalInterface
public interface MyInterface {

	int excute(int num);

}
  • 測試類
package com.rrss.test;

import org.junit.Test;

/**
 * @author lzx
 *
 */
public class LambdaPractice {

	@Test
	public void testLambda() {

		int num = calc(10, (x) -> x + 100);
		System.out.println("加法運算:" + num);
	}

	@Test
	public void testLambdaFun() {

		int num = calc(10, (x) -> x * 100);
		System.out.println("乘法運算:" + num);
	}

	public int calc(int num, MyInterface data) {
		return data.excute(num);
	}

}

  未完待續...

相關文章
相關標籤/搜索