ホームページ  >  記事  >  Java  >  Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI

(*-*)浩
(*-*)浩転載
2019-10-23 16:12:152588ブラウズ

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI

ラムダ式

1. これは、匿名内部クラス オブジェクトの形式を簡略化したものです。

2. 新しいものが Java8 で導入されました。演算子 "->" は、アロー演算子、またはラムダ演算子

3 と呼ばれます。その機能は、前部と後部を 2 つの部分

4 に分割することです。左側: を表します。 Lambda 式 パラメータリスト (インターフェースに定義された抽象メソッドのパラメータ)

5. 右側: メソッドのメソッド本体、Lambda 本体を表します

記述構文形式

1 パラメータも戻り値もありません。

左括弧は省略できません。右中括弧は省略できます。

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI

##2 パラメータは 1 つあり、戻り値はありません。

パラメータは複数あり、戻り値はありません。

左括弧は省略してもしなくてもよく、右括弧は省略してもよいし、省略してもよい省略不可

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI

3. インターフェイスには書き換える必要があるメソッドが多数あり、複数の文に中括弧を追加する必要があります

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPI#Note 注: ラムダ本体にステートメントが 1 つだけある場合は、中かっこを省略できます。中かっこ内のステートメントが 1 つだけで、それが return ステートメントである場合は、return キーワードを省略できます。

関数型インターフェイス

ラムダ式を使用するための前提条件は、インターフェイスが関数型インターフェイスである必要があることです。インターフェイスに抽象メソッドが 1 つしかない場合、そのインターフェイスはは関数型インターフェイスです。一般的なアノテーションは、現在のインターフェイスが関数型インターフェイスであるかどうかを確認する @FunctionalInterface、関数型インターフェイスでない場合、コンパイル エラーが報告されます

Function:

表現したいのはメソッドの内容ですメソッドはクラスにないのですべて関数と呼ばれます実際にインターフェースが表現したいのは関数の宣言です次は実装ですこのインターフェイスのクラス オブジェクトは、関数の実施形態を表現するために使用されます

Consumption インターフェイス:

抽象メソッド: 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. 関数型インターフェイスを作成する場合、メソッド Implementation は他のオブジェクトによって実装されているため、Lambda でこの実装を再度呼び出す必要はありません。直接定義されたメソッド

2. 形式

Function 関数インターフェース: Name = オブジェクト名:: メソッド名

関数インターフェース: Name = クラス名:: 静的メソッド名

3. 関数

実装したものを関数インタフェースのリファレンスにデータを参照として代入し、このリファレンスをメソッドの戻り値として利用可能、または実装クラスのオブジェクトとして

#StreamingAPI

Java8 の新機能ラムダ、関数型インターフェイス、StreamingAPIjdk1.8では、コンテナ内のデータを簡単に操作できるストリーム型が提供されています。データのフィルタリング、出力、その他の操作はループを手動で定義することなく完了できます

ストリームの種類と共通メソッドの取得

コレクションの取得:

stream() メソッドを呼び出しますそして、Stream オブジェクトをコールバックします。

Termination メソッド: foreach count

Delay メソッド: フィルター制限スキップなど。

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);
   }
}

Exercise

Arraylist が 2 つあります。チーム内の複数のメンバーの名前を保存するコレクション。Stream メソッドを使用して次の手順を実行します

1。最初のチームには 3 文字のメンバーの名前のみが必要です

2. 最初のチームにはスクリーニング後の最初の 3 人のみが必要です

3. 2 番目のチームには Zhang という姓の人のみが必要です

4. 2 番目のチームのスクリーニング後、最初の 2 人は人は必要ありません

5. 2 つのチームを 1 つのチームにマージします

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 の新機能ラムダ、関数型インターフェイス、StreamingAPIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。