ラムダ式のJavaで別の匿名関数を返します

Tom_G_99:

これは、Javaでのラムダ式で別の関数を返すことはできますか?私は、次のラムダ式を持っていると言います

addFive = (x) -> x+5;
addFiveIfPositive = (y) -> {
    if (y > 0) return addFive;
    else return y;
};

私はこれを求めているの背後にいくつかのコンテキストを与えるために、私はすでに、いくつかの条件を考えると、再び同じコードを書くにはない定義したので、私は、コンパレータを定義するためにラムダ式で働いていると、いくつかの比較のために、私は「チェーン」のコンパレータにしたいです上記の例のように。

任意の助けいただければ幸いです。

編集:これは私が働いているかのより多くの代表的な例です。

import java.util.Comparator;

class Random{
    Integer val;
    String str;

    Random(int val, String str){
      this.val = new Integer(val);
      this.str = str;
    }
}

public class Temp{

  static Comparator<Random> c1 = (r1, r2) -> (r1.val).compareTo((r2.val));
  static Comparator<Random> c2 = (r1, r2) -> {
    if ((r1.str).compareTo((r2.str)) == 0){
      return c1.apply(r1,r2);
    }
    return (r1.str).compareTo((r2.str));
  };

  public static void main(String args){
    Random rand1 = new Random(1, "Hello");
    Random rand2 = new Random(2, "Hello");
    System.out.println(c2.compare(rand1, rand2));
  }
}

.apply()を使用すると、私にエラーを与えます

Temp.java:18: error: cannot find symbol
      return c1.apply(r1,r2);
               ^
  symbol:   method apply(Random,Random)
  location: variable c1 of type Comparator<Random>
また:

編集によると、あなたが探しているすべてのを利用することです。

Comparator<Random> c1 = Comparator.comparing(Random::getVal);
Comparator<Random> c2 = Comparator.comparing(Random::getStr).thenComparing(c1);;

あなたがすでに持っているので、それがあるComparatorと、連鎖の使用事例サポートのthenComparingAPIを。これはちょうど、次のコードを簡略化したものであることに注意を行います。

Comparator<Random> c1 = (r1, r2) -> (r1.val).compareTo((r2.val));
Comparator<Random> c2 = (r1, r2) -> {
    if ((r1.str).compareTo((r2.str)) == 0){
        return c1.compare(r1,r2); //'compare' instead of 'apply'
    }
    return (r1.str).compareTo((r2.str));
};

編集する前に、次のような条件を表現するために三項演算子を使用している可能性が:

IntFunction<Integer> addFive = x -> x + 5;
IntFunction<Integer> addFiveIfPositive = y -> y > 0 ? y + 5 : y;

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=279890&siteId=1