Java8の@FunctionalInterfaceを使う

関数インターフェースのPredicateとかFunctionがあるのであんまり使わないけど、引数とか3つ以上のものはないのでつくる必要がある。

基本的に抽象メソッドを1つしかもっていなければOK。defaultメソッドはいくつもっていてもOKです。(ラムダ式のときに何を使うかわからなくなっちゃうからかなと)

@FunctionalInterface
interface SampleInterface {
      boolean filter(String a);
}

こんな感じでカンタンに作れる

使うときはこんな感じでカンタンに使える。

SampleInterfacle sampleFilter = s -> "a".equals(s);
sampleFilter.filter("a");

なんかもうカンタン過ぎますね

ちなみに引数3つは、こんな感じ

@FunctionalInterface
interface SampleInterface {
      boolean filter(String a, String b, String c);
}

SampleInterfacle sampleFilter = (s, t , u)  -> "a".equals(s);
sampleFilter.filter("a","b","c");

こんな感じで使える。なんかもうカンタン過ぎますね。みんなもっと使いましょう!

Javaの関数インターフェース再入門

Javaのよく使ってる関数インターフェース群をまとめようかとおもう。
現場ごとに説明のためのドキュメントを書くのがしんどくなってきたからというのが本音かも。

predicate

断言するって意味。戻り値はBoolean。
引数1つとって

Predicate<String> matchA = s -> s.matches(".*a.*");  // 'a'があればtrue
Predicate<String> matchB = s -> s.matches(".*b.*"); // 'b'があればtrue
Predicate<String> noA = matchA.negate(); // 'a'があったらfalse

// 合成
Predicate<String> ab = matchA.and(matchB); // 'a'と'b'があったらtrue
Predicate<String> ab = matchA.or(matchB); // 'a'または'b'があったらtrue

実行はtest(T)でできる。カンタン。streamのfilterとかで使える。テストもカンタン。

matchA.test("a");

これで実行できる。

ちなみに2つ引数とることもできる

BiPredicate<String,String> matchAB = (s,t) -> s.matches(".*a.*") && t.matches(".*a.*");

suppplier

供給するって意味

引数なし、戻り値あり。引数ないけど、それ単体で何かが発生する。
なにかと組み合わせてデータ流す感じかな

Supplier<String> supplier = () -> {
     SecureRandom random = new SecureRandom();
     return String.valueOf(random.nextInt());
};

ランダムintを返却する

supplier.get()

consumer

消費するって意味。
実際に引数とって、そのあと処理する。戻り値なし。

下記のような感じ

Consumer<String> show = s -> System.out.println(s);

下記のように使う

s.accept("s");

2つ引数とることも可能

BiConsumer<String,Integer> biShow = (s,i) -> {
    System.out.println(s);
    System.out.println(i);
};

Function

機能として使える関数インターフェース

引数と戻り値を持てる。
引数2つまで持てるものもある。(BiFunction)

下記のように定義できる

Function<Integer,String> exchangeString = t -> String.valueOf(t);
BiFunction<Integer,Integer,String> biExchange = (t,u) -> String.valueOf(t + u);

下記のように使える

exchangeString.apply(1);
biExchange.apply(1,2);

awsのlambdaをserverless framework runtime Java8の環境構築

AWSのlambdaをserverless frameworkでJavaで動かそうとしているので、環境構築メモ

serverless frameworkインストール

まずはnpmでインストール

$ npm install -g serverless 

templateプロジェクト作成

今回は、aws-gradle-javaで作ることに

$ serverless create --template aws-java-gradle --path ${プロジェクト名}
$ cd ${プロジェクト名}

ローカル環境で実行

Javaプロジェクトをビルドしたあとにローカル環境で実行してみる
hello というエンドポイントが設定されてるので、これで実行してみる

$ serverless invoke local --function hello

Serverless: In order to get human-readable output, please implement "toString()" method of your "ApiGatewayResponse" object.
log4j:WARN No appenders could be found for logger (com.serverless.Handler).

log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

com.serverless.ApiGatewayResponse@475530b9

こんな感じで、Javaが実行される

awsのアップロード等は次回