",稱為箭頭運算符,或lambda運算符;作用是分割前後兩部分的"/> ",稱為箭頭運算符,或lambda運算符;作用是分割前後兩部分的">

首頁 >Java >java教程 >Java8新功能的lambda,函數式接口,StreamingAPI

Java8新功能的lambda,函數式接口,StreamingAPI

(*-*)浩
(*-*)浩轉載
2019-10-23 16:12:152618瀏覽

Java8新功能的lambda,函數式接口,StreamingAPI

Lambda表達式

#1.是對匿名內部類別物件的一種格式的簡化

2.Java8中引入了一個新的運算子"->",稱為箭頭運算符,或lambda運算子

3.作用就是分割前後兩部分的

4.左邊:表示的是Lambda表達式的參數列表(介面中,定義的抽象方法的參數)

5.右邊:表示的是方法的方法體,Lambda體

語法格式的書寫

##1 .沒有參數,也沒有回傳值

左面的小括號不能省,右邊的大括號可以省略也可以不用省

Java8新功能的lambda,函數式接口,StreamingAPI
##2 .有一個參數,沒有回傳值

有多個參數,沒有回傳值

左邊的括號可省可不省,右邊的大括號可以省也可以不用省

Java8新功能的lambda,函數式接口,StreamingAPI3.介面中需要重寫的方法內容很多,需要給多句話的加上大括號

##注意事項:如果Lambda體中的語句有隻有一句,那麼大括號可以省略不寫;如果大擴號中只有一條語句,並且是return語句,那麼return關鍵字可以省略不寫Java8新功能的lambda,函數式接口,StreamingAPI

#函數式接口

Lambda表達式使用的前提,就是接口必須是函數式接口,如果在接口中,只有一個抽象方法,那麼這個接口就是函數式接口,常用一個註解來檢查當前接口是否是一個函數式接口@FunctionalInterface,如果不是函數式接口,則編譯報錯

作用:

想表達的是一個方法的內容,由於方法不在任何類別中,所有被稱為函數,接口其實想表達的就一個函數的聲明,接下來的使用這個接口的實現類對象,來表達一個函數的體現

#消費型介面:

抽象方法:void accept(T t)

#當某個函數可以接受一個數據,並且處理這個數據,處理完成之後,就不需要傳回任何數據,這個函數需要當做數據來進行傳遞,就使用消費型介面

package cn.ujiuye.function;
import java.util.function.Consumer;
import cn.ujiuye.domin.Mobile;
/**
 * @author liugang
 * 消费型接口方式
 */
public class CustmoerTest {
     public static void main(String[] args) {
	    Mobile m = new Mobile("华为",3000);
	     //lambad表达式实现赋值  内部显然是对消费者接口的使用,故是对函数式接口编程的新东西
	     updateMobile(m, x -> x.setPrice(x.getPrice() + 1000 ));
	     System.out.println(m);
	 }
    //调用其使用的方法
	private static void updateMobile(Mobile m, Consumer<Mobile> con) {
	     for (int i = 0; i < 3; i++) {
		     con.accept(m);	
		 }
	}
}

方法引用

1.寫一個函數式介面時,方法的實現,已經被某個其他的物件實現了,就不需要在Lambda中了,再次調用這個實現,而可以那個直接定義好的方法了

2.格式

#函數式介面:名稱= 物件名稱:: 方法名稱

函數式介面: 名稱= 類別名稱::靜態方法名稱

#3.作用

把已經實現的當做一個數據,作為一個引用,賦值給某個函數式介面的引用,可以把這個引用當做方法的回傳值,也可以作為一個實現類別物件

StreamingAPI Java8新功能的lambda,函數式接口,StreamingAPI

在jdk1.8中,提供了一個stream類型,可以很方便的操作容器中的數據,不需要手動定義循環就可以完成對數據的過濾,輸出及其其他的操作

Stream的類型的取得與常用方法

Collection的取得:

呼叫stream()方法,調回Stream物件

終止方法:foreach count

延遲方法:filter limit skip 等

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
/**
 * @author liugang
 *
 */
public class StreamApiDemo03Demo03 {
    public static void main(String[] args) {
    	//定义一个集合,并获取stream类型的数据
		List<Integer> list = new ArrayList<Integer>();
		Collections.addAll(list, 12,32,-13,50,100);
		Stream<Integer> stream = list.stream();
		stream.forEach(x ->System.out.println(x - 100));
		System.out.println(list.stream().count());
    }
}

package cn.ujiuye.stream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;
/**
 * @author liugang
 * Stream中一些方法的使用
 */
public class StreamApiDemo04 {
   public static void main(String[] args) {
	   ArrayList<Integer> list = new ArrayList<>();
	   Collections.addAll(list, -4,-12,-199,0,15,25,36,100);
	   Stream<Integer> stream = list.stream();
	   stream.filter(x -> x > 0)    //过滤
	         .skip(1)               //跳过
	         .limit(2)              //限制
	         .sorted((x,y) -> -1)   //排序
	         .forEach(System.out::println);
   }
}

練習

#有兩個Arraylist集合,儲存隊伍中的多個成員姓名,使用Stream方式,對以下步驟進行操作

1、第一個隊伍只要名字為3個字的成員姓名

2、第一個隊伍只要篩選之後的前三個人

3、第二個隊伍只要姓張的

4、第二個隊伍篩選之後不要前兩個人

5、將兩個隊伍合併成一個隊伍

6、合併之後的隊伍中的所有人的Person(自訂類型)對象,儲存到一個ArrayList集合中

隊伍1:宮本武藏、宋公明、蘇有朋、石頭人、時傳祥、李耳、莊子、洪七公

隊伍2:帕瓦羅蒂、張三瘋、趙薇薇、張自忠、孛兒只斤鐵木真、張天愛、張翠花

public class StreamApiTest {
    @SuppressWarnings("unused")
	public static void main(String[] args) {
	    //创建集合
    	List<String> list1 = new ArrayList<String>();
	    List<String> list2 = new ArrayList<String>();
	    //把元素添加到集合中
	    Collections.addAll(list1, "宫本武藏","宋公明","苏有朋","石头人","时传祥","李耳","庄子","洪七公");
	    Collections.addAll(list2, "帕瓦罗蒂","张三疯","赵薇薇","张自忠","孛儿只斤铁木真","张天爱","张翠花");
	    //创建Stream对象
	    Stream<String> stream1 = list1.stream();
	    Stream<String> stream2 = list2.stream();
	    //创建筛选后的元素
	    Stream<String> limit1 = stream1.filter(x -> x.length() == 3).limit(3);
	    Stream<String> limit2 = stream2.filter(x -> x.startsWith("张")).skip(2);
	    //将两对的人合到同一个对里
	    Stream<String> concat = Stream.concat(limit1, limit2);
	    //定义一个集合用来存对象
	    List<Person> list = new ArrayList<Person>();
	    //想要的是一个Person对象的流
	    //Stream<Person> map = concat.map(x -> new Person(x);
	    Stream<Person> map = concat.map(Person::new);
	    //将流对象添加到集合中
	    map.forEach(list::add);
	    System.out.println(list);
	}
}

以上是Java8新功能的lambda,函數式接口,StreamingAPI的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除