Java:映射将 lambda 存储为值

Mar*_*lka 3 java lambda gosu functional-interface

我想学习 Java 的“新”语法和 API 中的可能性。更新我的意思是 10+(比方说 10-13)。它主要围绕 lambdas 的声明和存储与映射中的值相同的签名的不同实现。最近我主要和 Gosu 一起工作,我可以用这个片段:

var longInput = 10000000L

new LinkedHashMap<String, block(long) : long>( {
    "byte"  -> (\x -> x as byte as long),
    "short" -> (\x -> x as short as long),
    "int"   -> (\x -> x as int as long),
    "long"  -> (\x -> x as long as long)
}).eachKeyAndValue(\key, value ->
  print("${longInput} ${value(longInput) == longInput ? "can" : "cannot"} be converted to ${key}")
)
Run Code Online (Sandbox Code Playgroud)

我可以在 Java 10 中类似地做到这一点:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        long longInput = 10000000L;

        var conversions = new LinkedHashMap<String, Conversion<Long>>();
        conversions.put("byte",  (x) -> (long) (byte)  x.longValue());
        conversions.put("short", (x) -> (long) (short) x.longValue());
        conversions.put("int",   (x) -> (long) (int)   x.longValue());
        conversions.put("long",  (x) -> (long) (long)  x.longValue());

        conversions.forEach((key, value) -> {
            System.out.printf("%d %s be converted to %s%n", longInput, value.convert(longInput) == longInput ? "can" : "cannot", key);      
        });
    }
}

interface Conversion<T> {
    T convert(T input);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 是否可以在没有命名接口的情况下完成,但可以像 Gosu 一样以类似的“匿名”功能方式完成?
  2. 还有什么可以使 Java 中的更简洁的吗?

更新:这只是一些围绕代码的游戏,其目的是将原始 long 类型转换为较小类型并返回。灵感来自https://www.hackerrank.com/challenges/java-datatypes/problem。所以从我的角度来看,我想留下来。

使用答案,我当前的 Java 10 代码如下所示:

public class Test { 
    public static void main(String[] args) {
        var longInput = 10000000L;

        new LinkedHashMap<String, UnaryOperator<Long>>() {{
            put("byte",  (x) -> (long) (byte)  x.longValue());
            put("short", (x) -> (long) (short) x.longValue());
            put("int",   (x) -> (long) (int)   x.longValue());
            put("long",  (x) -> (long) (long)  x.longValue());
        }}.forEach((key, value) -> {
            System.out.printf("%d %s be converted to %s%n", longInput, value.apply(longInput) == longInput ? "can" : "cannot", key);        
        });
    }
}

Run Code Online (Sandbox Code Playgroud)

Nam*_*man 6

是否可以在没有命名接口的情况下完成,但可以像 Gosu 一样以类似的“匿名”功能方式完成?

Java 已经有一个类似于您定义的 FunctionalInterface。您可以在UnaryOperator<Long>您的Map.

还有什么可以使 Java 中的更简洁的吗?

在我看来,这会读得更好:

Map<String, UnaryOperator<Long>> conversions = new LinkedHashMap<>();
conversions.put("byte", a -> (long) a.byteValue());
conversions.put("short", a -> (long) a.shortValue());
conversions.put("int", a -> (long) a.intValue());
conversions.put("long", a -> a); // UnaryOperator.identity()
Run Code Online (Sandbox Code Playgroud)