Java インスタンスイニシャライザとか普通のブロックとか、見た目同じよね...

f:id:ts0818:20190810095940p:plain

括弧(かっこ)は、約物の一つ。言語の記述の中で、その一部を一対の括弧で囲むことにより、その中と外とを区切る役割を果たす。または目立たせる。

括弧は対で使用され、先に記述される括弧を括弧開き(かっこひらき)または始め括弧(はじめかっこ)、後に記述される括弧を括弧閉じ(かっことじ)または終わり括弧(おわりかっこ)と呼ぶ。横書き表記の記述においては、相対的に左括弧(ひだりかっこ)・右括弧(みぎかっこ)とも呼ぶ。また、対となる括弧がそれぞれ縦並びの括弧を縦括弧(たてかっこ)、横並びの括弧を横括弧(よこかっこ)と呼ぶ。

括弧 - Wikipedia

とあって、

波括弧{}

波括弧(なみかっこ)は、ブレースブレイスbrace)および カーリーブラケットcurly bracket)・カールcurl)とも言う。なお、中括弧(ちゅうかっこ)と呼ばれることもあるが、この呼び方は望ましくないと考えられる

括弧 - Wikipedia

多くのプログラミング言語ではブロックを記述するときに用いられる。

括弧 - Wikipedia

 であると...あっ!どうもボクです。 そんなわけで、今回も、Javaのお話。レッツトライ~。

 

{ } を使う言語ですもんね、Java

最近、こんな感じのJavaのソースを見たんですよ。 

mainProcess: {
  // ここにいろんな処理
}

ホワッツ!?

見たことない書き方だな~、と思ってたところ、

irof.hateblo.jp

⇧  上記サイト様で紹介されていました。

どうやら、ラベル付きのブロックということになるらしい。

う~ん、なかなかトリッキーな書き方が存在するんですね。

というわけで、ついでに、関数型インターフェイスの練習で。

 

www.baeldung.com

ocs.hatenadiary.org

teratail.com

⇧  上記サイト様を参考にさせていただきました。

 

Eclipseで、適当なJavaプロジェクトを作成。クラスも作成。

f:id:ts0818:20190810124131p:plain

package entity;

import java.io.Serializable;

public class Employee implements Serializable {

	private String name;

	private int age;

	private String birthPlace;

	public Employee() {

	}

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

	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 String getBirthPlace() {
		return birthPlace;
	}

	public void setBirthPlace(String birthPlace) {
		this.birthPlace = birthPlace;
	}
}

 

package main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import entity.Employee;

public class TestFunctionInterface {

  public static void main(String[] args) {
    // Functionインターフェース
    // ラムダ式、関数型インターフェイスを使う場合
    Function<String, Integer> func = x -> x.length();
    System.out.println("Fucntionインターフェイスを使った結果: ");
    System.out.println(func.apply("ベンティアドショットヘーゼルナッツバニラアーモンドキャラメルエキストラホイップキャラメルソースモカソースランバチップチョコレートクリームフラペチーノ"));

    // Predicateインターフェース
    // ラムダ式で、関数型インターフェイスを使う場合

    Predicate<? super Employee> pred01 = emp -> emp.getAge() > 30 && emp.getBirthPlace().equals("America");
    Predicate<? super Employee> pred02 = emp -> emp.getAge() > 30
        && emp.getBirthPlace().equals("Azərbaycan Respublikası");
    Predicate<? super Employee> pred03 = emp -> emp.getAge() > 30 && emp.getBirthPlace().equals("Bachikan");
    Predicate<? super Employee> pred04 = emp -> emp.getAge() > 30
        && emp.getBirthPlace().equals("República Federativa do Brasil");
    Predicate<? super Employee> pred05 = emp -> emp.getAge() > 30 && emp.getBirthPlace().equals("Japan");

    List<Predicate<? super Employee>> preds = new ArrayList<Predicate<? super Employee>>(
        Arrays.asList(pred01, pred02, pred03, pred04, pred05));

    Employee emp01 = new Employee("Toshi", 36, "Japan");
    Employee emp02 = new Employee("Rocky", 31, "Repubblica Italiana");
    Employee emp03 = new Employee("Alice", 28, "Bachikan");
    Employee emp04 = new Employee("Agaiefu", 33, "Azərbaycan Respublikası");
    Employee emp05 = new Employee("Rob", 35, "America");
    Employee emp06 = new Employee("Paulo", 71, "República Federativa do Brasil");

    List<Employee> emps = new ArrayList<>(Arrays.asList(emp01, emp02, emp03, emp04, emp05, emp06));

    // or 条件でフィルター
    emps = emps.stream()
        .filter(preds.stream().reduce(pred -> false, Predicate::or))
        .collect(Collectors.toList());

    System.out.println("Predicateインターフェースを使った結果: ");
    emps.forEach(emp -> {
      System.out.println(emp.getName());
    });

  }
}

んで、実行してみる。

f:id:ts0818:20190810124250p:plain

f:id:ts0818:20190810124337p:plain

Stream APIのfilter に、Predicate のListを指定してフィルタリングできました~。

Predicateに保存する条件式をもっと汎用的に使えるようなものにすれば、いろいろ使えそうですかね?

その前に、Employee エンティティがNULLだったら落ちるね...NullPointerException対策が必要ですな(涙)。

相変わらず、関数型にはまだ慣れない、今日この頃。

今回はこのへんで。