関数型プログラミングの01 28Java中間

1ラムダ式

ユーザコードの開発を簡略化するために開始されてからJDK 1.8は、これによりラムダ式支持体は関数型プログラミングの形で実現することができ、具体的に提供されます。もっとよく知られている関数型プログラミング言語のために:ハスケル、Scalaは、関数型プログラミングを使用することは、オブジェクト指向プログラミングの問題の面倒なプロセスを回避します。

オブジェクト指向の長期的な発展の過程では、相手の一部となっているが、反対派は、これらのオブジェクト指向設計が複雑すぎると主張し、あまりにも簡単な例をプログラムが面倒。
例:従来の開発課題の観察

interface IMessage{
	public abstract void fun();
}

public class JavaDemo{

	public static void main(String[] args){
		IMessage msg = new IMessage(){
			public void fun(){
				System.out.println("hhy");
			}
		};
		msg.fun();
	}
}

このようなプログラムでおり、実際には、コア構造機能の設計だけで1行の文が、我々はまだYaoanは完全なオブジェクト指向開発を与えられました。技術の発達により、これらの問題はそうでなく、より多くの著名な。
例:使用ラムダ式は、前とまったく同じ機能を実現します

interface IMessage{
	public abstract void fun();
}

public class JavaDemo{

	public static void main(String[] args){
		IMessage msg = ()->{
				System.out.println("hhy");
		};
		msg.fun();
	}
}

この形式では、オブジェクト指向の構造の複雑な要件を回避することができます。
SAM(シングル抽象メソッド)、唯一の抽象メソッド:使用したい場合はラムダ式は、それが重要な要件を満たす必要があります。唯一のインターフェースメソッドは機能インタフェースと呼ばれ、インターフェース関数はラムダ式でのみ使用することができます。明確なインタフェース機能インタフェースを示すために、注釈注釈(@FunctionalInterface)を使用します。
例:機能的注釈インターフェースを使用

@FunctionalInterface
interface IMessage{
	public abstract void fun();
}

public class JavaDemo{

	public static void main(String[] args){
		IMessage msg = ()->{
				System.out.println("hhy");
		};
		msg.fun();
	}
}

:ラムダ式の目的のために、以下の形式が提供される
。> {}( - ):(1)パラメータなし
パラメータを有する(2):(パラメータ、パラメータ) - > {};
(3)電流Ifを:(文のリターンのみ1行パラメータ、パラメータ) - >声明;
例:パラメータを定義する方法はありません。

@FunctionalInterface
interface IMessage{
	public abstract void fun();
}

public class JavaDemo{

	public static void main(String[] args){
		IMessage msg = ()->{
				System.out.println("hhy");
		};
		msg.fun();
	}
}

例:メソッドのパラメータを定義します

@FunctionalInterface
interface IMath{
	public abstract int add(int x, int y);
}

public class JavaDemo{

	public static void main(String[] args){
		IMath math = (x, y)->{
				return x + y;
		};
		System.out.println(math.add(10, 3));
	}
}

単一のステートメントをより簡単にすることができる
。例:コードを簡素化

@FunctionalInterface
interface IMath{
	public abstract int add(int x, int y);
}

public class JavaDemo{

	public static void main(String[] args){
		IMath math = (x, y)-> x + y;
		System.out.println(math.add(10, 3));
	}
}

使用Lmbda式は確かに構造上の伝統的なオブジェクト指向の制約に取り除くことができ、コードをより簡単になります。

2参照方法

リファレンス最大の特徴は、データ・メモリの種類に対処するために指すことができますが、従来の開発では、JDK 1.8は、また、参照する方法が提供された後から、オブジェクト参照の操作を使用しています。、すなわち:別の方法としては、同じメソッド名として記述することができます。:あなたは、4つの形式があるJavaでの参照方法を提供したい場合は
、クラス名::静的メソッド名:(1)参照静的メソッド
(2)オブジェクトのメソッドのインスタンスへの参照:::オブジェクトの共通メソッドのインスタンスを、
(3 ;特定のクラス::従来方法)の方法の特定の型を参照
クラス名::新しい:(4)参照コンストラクタ。
例:参照静的メソッド
文字列静的方法:パブリック静的文字列のvalueOf(I INT )

@FunctionalInterface
interface IFunction<T, U>{
	public abstract T fun(U n);
}

public class JavaDemo{

	public static void main(String[] args){
		IFunction<String, Integer> f = String::valueOf;
		System.out.println(String.valueOf(12));
		System.out.println(f.fun(12));
	}
}

参照複数を使用する方法は、メソッド名として定義することができるが、要求インターフェイス関数でなければなりません。
例:メソッドオブジェクトの参考例

@FunctionalInterface
interface IFunction<T>{
	public abstract T fun();
}

public class JavaDemo{

	public static void main(String[] args){
		IFunction<String> f = "hhy"::toUpperCase;
		System.out.println(f.fun());
	}
}

方法を実施するときに、特定のクラスのいくつかの操作基準方法で参照することができます。
例:基準メソッド指定されたクラス

@FunctionalInterface
interface IFunction<T, U>{
	public abstract T fun(U s1, U s2);
}

public class JavaDemo{

	public static void main(String[] args){
		IFunction<Integer, String> f = String::compareTo;
		System.out.println(f.fun("A", "a"));
	}
}

例:参照のコンストラクタ

@FunctionalInterface
interface IFunction<T>{
	public abstract T fun(String s1, int s2);
}

class Person{
	private String name;
	private int age;

	public Person(){}

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

	public String toString(){
		return name + "  " + age;
	}
}

public class JavaDemo{

	public static void main(String[] args){
		IFunction<Person> f = Person::new;
		System.out.println(f.fun("lks", 23));
	}
}

のみサポート参照を補う概念のより多くの状況下での参照方法を提供します。

3組み込み関数インターフェース

ご注文いただいた場合例多くて、1.8ラムダ式もメソッド参照を提供している、それ自体は、多くの場合、多くのことを宣言するために、「@FunctionalInterface」のアノテーションを使用する必要がある開発者が関数インタフェースを定義した場合、あなたが今見つけるJDKで提供直接参照関数は、簡単にシステム・インターフェースで提供することができます。

:具体的には、このパッケージでは、直接機能CANインタフェースは、いくつかのコア以下のインタフェース以下の通りであるjava.util.function開発システム、パッケージが提供される
1は、機能インタフェース機能を
定義インターフェース。

@FunctionalInterface
public interface Function<T,R>{
    public R apply​(T t);
}

インターフェース:
文字列方法がある:パブリックブールのstartsWith(文字列str) 。

import java.util.function.*;
public class JavaDemo{

	public static void main(String[] args){
		Function<String, Boolean> fun = "**hello"::startsWith;
		System.out.println(fun.apply("**"));
	}
}

2、消費者インターフェース機能:データは、任意の復帰せず、動作のみを処理します。
)(...のSystem.outのprintln;データ出力は、システムを使用して実行されたときに
インタフェース定義:

@FunctionalInterface
public interface Consumer<T>{
    public void accept​(T t);
}

インタフェース:

import java.util.function.*;
public class JavaDemo{

	public static void main(String[] args){
		Consumer<String> con = System.out::println;
		con.accept("hhy");
	}
}

図3に示すように、電源及び機能インターフェース
小文字toLowerCaseメソッド法()が設けられ、このメソッドの値は、Stringクラスで受信するが、戻り値を持たれていない
インタフェース定義を:

@FunctionalInterface
public interface Supplier<T>{
    public T get();
}

インタフェース:

import java.util.function.*;
public class JavaDemo{

	public static void main(String[] args){
		Supplier<String> sup = "HHY LOVE" :: toLowerCase;
		System.out.println(sup.get());
	}
}

4、アサーション型機能インタフェース:判定処理は、
クラス文字列内equalsIngoreCase()メソッドを有します。
インタフェースの定義:

@FunctionalInterface
public interface Predicate<T>{
    public boolean test​(T t);
}

インタフェース:

import java.util.function.*;
public class JavaDemo{

	public static void main(String[] args){
		Predicate<String> pre = "hhy" :: equalsIgnoreCase;
		System.out.println(pre.test("HHY"));
	}
}

JDK自体が関数インタフェースは、私たちが使用することができます提供している場合、将来の実際のプロジェクトの開発の中で、その後、再定義する必要はありません。

公開された77元の記事 ウォン称賛11 ビュー2637

おすすめ

転載: blog.csdn.net/weixin_43762330/article/details/104564486