関数型プログラミング
オブジェクト指向は、「すべてがオブジェクトである」ということを強調します。何かをしたい場合は、オブジェクトを見つける必要があります。でやります。関数型プログラミングの考え方では、「方法」ではなく「何を行うか」に重点が置かれます。
通常のオープニング スレッド
// 匿名内部类对象 Runnable task = new Runnable() { @Override public void run() { System.out.println("乌鸦坐飞机"); } }; new Thread(task).start();
その他の Java 関連の無料ビデオ チュートリアル: Java オンライン チュートリアル
関数を開く
new Thread(() -> System.out.println("龙卷风摧毁停车场")).start();
のようなプログラミングを使用したスレッド その前の括弧: メソッドのパラメータ。パラメータがない場合は、()と書きます。矢印は後で何を行うかを指します。矢印の後ろは次のようになりますメソッド本体の中括弧。特定の実行内容を表します。
ラムダ式
クロージャとも呼ばれるラムダ式は、Java 8 のリリースを推進する最も重要な新機能です。
Lambda では、関数をメソッドのパラメーターとして使用できます (関数はパラメーターとしてメソッドに渡されます)。ラムダ式を使用すると、コードをより簡潔でコンパクトにすることができます。
3 つの要素: パラメーター、矢印、コード
形式: (パラメーター タイプ パラメーター名) -> {コード}
ラムダ式を使用する式の前提: インターフェイスが存在する必要があり、インターフェイスには抽象メソッドが 1 つだけあります。
デモ: Cook インターフェイスを作成します。インターフェイスには makeFood() メソッドがあります。
public static void main(String[] args) { method(() -> { System.out.println("闪刀启动!"); }); } private static void method(Cook cook) { cook.makeFood(); }
ラムダ式 数式省略規則:
パラメータの型は省略可能です。ただし、すべてのパラメータの型を同時に省略するか、まったく省略できないことのみ可能です。パラメータが 1 つだけある場合、括弧は省略できます。中括弧内のステートメントが 1 つだけの場合、戻り値の有無に関係なく、return、括弧、セミコロンは省略できます。
public static void main(String[] args) { method((a, b)-> a + b); } private static void method(Calculator calculator) { int result = calculator.sum(1234, 9876); System.out.println(result); }
新しいインターフェイスの場合、匿名内部クラスの代わりにラムダ式を使用することもできます
Runnable task = () -> System.out.println("闪刀启动!"); new Thread(task).start();
関数型インターフェイス
インターフェイスには と があります関数インターフェイスと呼ばれる抽象メソッドは 1 つだけです。
アノテーション @FunctionalInterface
が JDK8 に追加されました。これは、インターフェイスが機能インターフェイスであるかどうかを検出するために使用されます。機能的なインターフェイスではない場合、コンパイル中にエラーが報告されます。 @FunctionalInerface アノテーションはオプションであり、このアノテーションを使用しない場合でも、関数型インターフェースの定義要件を満たしている限り、それは関数型インターフェースです。
@FunctionalInterface public interface MyInterface { void method(); }
メソッドリファレンス
Printer printer = (str) -> System.out.println(str);
このコードは実際には次のようになります。略称。
推論可能な限り参照可能であるため、パラメータを渡すことは実際には無意味であるため、ここでは実際にメソッド参照を使用して System.out::println
s->System.out.println(s)
System.out::println
public static void main(String[] args) { method(System.out::println); } private static void method(Printer printer) { printer.print("hello"); }
インターフェイス
デフォルト メソッド
元々は 2 つの抽象メソッドだったインターフェイスを 3 つの抽象メソッドに変更する必要があり、その実装クラスも新しいメソッドを実装する必要があります。 実装クラスが多すぎると操作が非常に面倒になる JDK では、拡張にはオープン、修正にはクローズというオープンクローズ設計モードを使用していました。つまり、新しいインターフェイスを作成し、元のインターフェイスを継承し、新しいメソッドを定義します。ただし、この場合、元の実装クラスには新しいメソッドがありません。この時点では、インターフェイスのデフォルトのメソッドが使用できます。 キーワードはデフォルトで変更され、メソッドにはメソッド本体が必要です。このようなメソッドのすべてのサブクラスはデフォルトで実装されます (自分で記述する必要はありません)。これをオーバーライドしたい場合は、実装クラス/** * 从java8开始,接口当中允许定义default默认方法 * 修饰符:public default(public可以省略,default不能省略) */ public interface MyInterface { void method1(); void method2(); default void methodNew() { System.out.println("接口默认方法执行"); } }
Note でオーバーライドすることもできます。 : インターフェイスのデフォルト メソッドは同等です。 したがって、新しいキーワードと 4 つの修飾子の「デフォルト」は同じ概念ではありません。
default キーワードを使用すると、プログラムで「多重継承」の効果を実現できます。静的メソッド
java8 からはインターフェース内で静的メソッドを定義できるようになり、使い方は一般クラスの静的メソッドと同じになります。public interface Animal { void eat(); static Animal getAnimal() { return new Cat(); } }
ストリーミング操作
ストリーミング処理が開発者に与える第一印象は、コレクション操作がはるかに簡単になるということです。通常、これを完了するには複数行のコードが必要です。ストリーミング処理を利用することで、操作を 1 行で実装できます。 たとえば、整数を含むコレクションからすべての偶数をフィルターで除外し、それらを新しい List にカプセル化して返したい場合、Java8 より前では、次のコードを実装する必要があります。 数値のコレクションの場合:List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 == 0) { evens.add(num); } }Java8 のストリーミング処理により、コードを次のように簡略化できます:
List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());上記のステートメント行、stream() 操作の意味を簡単に説明します。コレクションをストリームに変換し、filter() でカスタム フィルタリング プロセスを実行します。ここでは、ラムダ式ですべての偶数をフィルタリングし、最後に、collect() で結果をカプセル化し、Collectors.toList() で指定します。 List コレクションにカプセル化されます。そして戻ってきました。
常用操作案例:
//初始化list集合 List<String> list = new ArrayList<String>(); list.add("测试数据1"); list.add("测试数据2"); list.add("测试数据3"); list.add("测试数据12"); //使用λ表达式遍历集合 list.forEach(s -> System.out.println(s)); //结合Predicate使用和过滤条件筛选元素 Predicate<String> contain1 = n -> n.contains("1"); Predicate<String> contain2 = n -> n.contains("2"); //根据条件遍历集合 list.stream().filter(contain1).forEach(n -> System.out.println(n)); list.stream().filter(s -> contain1.test(s)).forEach(s -> System.out.println(s)); list.stream().filter(contain1.and(contain2)).forEach(n -> System.out.println(n)); list.stream().filter(contain1.or(contain2)).forEach(n -> System.out.println(n)); //将过滤后的元素重新放到一个集合中 List<String> newList = list.stream().filter(contain1.and(contain2)).collect(Collectors.toList()); 集合中decimal求和 BigDecimal sum = list .stream() .map(Person::getAmount) .reduce(BigDecimal::add) .get(); //排序 , 也需要新的集合接收 List<Student> resultList = new ArrayList<Student>(); resultList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList())
推荐java相关文章:java零基础入门
欢迎大家一起来学习!
以上がJDK8の新機能の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。