bugfix> java > 投稿

私はまだラムダ式を理解しようとしています。

このラムダ式を「通常の」式に変換したいと思います。

float evaluate = Arrays.stream(queries).mapToInt(query -> 
(query.getCategory().equals(this.classify(this.retrieve(query, database, featureType), k)) ? 1 : 0)).sum();

あなたたちはアイデアを持っていますか?

前もって感謝します。

回答 3 件
  • 次のコードを必要に応じて変更します

    あなたの例のLambda式は「isa」ToIntFunctionです (たとえば、Eclipseでは、Ctrl + 1 /変換を押して2つのバージョンを切り替えることもできます...)

       String[] queries = null;
        float evaluate = Arrays.stream(queries).mapToInt(
            new ToIntFunction<String>() {
                @Override
                public int applyAsInt(String query) {
                    return 0;
                }
            }
        ).sum();
    
    

    と同じです

    float evaluate = Arrays.stream(queries).mapToInt(query -> 0).sum();
    
    

  • With some assumptions..
    float evaluate = 0;
        int sum = 0;
        for(Query query : queries) {
            int categoryTypeFromDb = this.classify(this.retrieve(query, database, featureType), k) ? 1 : 0;
            if(query.getCategory().equals(categoryTypeFromDb)) {
                sum += categoryTypeFromDb;
            }
        }
        evaluate = sum;
    
    

  • まあ、それはもっとJavaストリーム式であり、ラムダは1つだけです。 Javaストリームメカニズムを展開すると、おおよそこのようになります。

    List<Integer> ints = new ArrayList<>();
        for(Query q: queries)
        {
            ints.add(query.getCategory().equals(this.classify(this.retrieve(query, database, featureType), k)) ? 1 : 0);
        }
        int sum = 0;
        for(int i: ints)
        {
            sum = sum + i;
        }
    
    

    その中のラムダを強調表示するには、の署名を確認する必要があります mapToInt

    IntStream mapToInt(ToIntFunction<? super T> mapper)
    
    

    ToIntFunctionはこのインターフェイスです。ラムダ全体は、このインターフェースに準拠するクラスを渡すためのシンタックスシュガーです。

    public interface ToIntFunction<T> {
        int applyAsInt(T value);
    }
    
    

    したがって、このインターフェイスを満たすオブジェクトを明示的に作成してコンパイラに実行させる代わりに、元のステートメントのラムダの糖分を自分で解除できます。

    Arrays.stream(queries).mapToInt(new ToIntFunction<Query>() {
            @Override
            public int applyAsInt(Object value) {
                return query.getCategory().equals(this.classify(this.retrieve(query, database, featureType), k)) ? 1 : 0;
            }
        }).sum();
    
    

あなたの答え