Я хочу изучить возможности в рамках «более нового» синтаксиса и API Java. Под более новым я имею в виду 10+ (скажем, 10-13). В основном это декларация лямбд и хранение различных реализаций, соответствующих одной и той же сигнатуре, как значения на карте Так как в последнее время я работаю в основном с 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}")
)

Я мог бы сделать это аналогично в 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);
}

Мои вопросы:

  1. Можно ли это сделать без использования именованного интерфейса, но с помощью аналогичной функции «анонимного», как в Gosu?
  2. Что-нибудь еще, что могло бы сделать это более кратким в Java?

Нет, это не было включено, спасибо большое, теперь работает

Используя ответы, мой текущий код 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);        
        });
    }
}

3
Marek Pulka 20 Дек 2019 в 16:38
Обратите внимание, что Shopify имеет 2 * разных представления продукта, одно на конечной точке {{X24}} и одно на конечной точке {{X25}}. Эти два объекта на удивление отличаются, и одно из этих различий заключается в том, что конечная точка {{X26}} не имеет совокупного значения {{X27}} - вам придется определить это самостоятельно, проверив наличие всех вариантов в пределах if используя эту конечную точку. Это одна из причин, по которой я обычно рекомендую использовать конечную точку {{X28}} для всех ваших потребностей Javascript.
 – 
Maarten Bodewes
20 Дек 2019 в 16:55
Это ошибка, с которой я столкнулся. drive.google.com/file/d/1TvqaJ8xr_5BJReUO >
 – 
Marek Pulka
20 Дек 2019 в 18:14

1 ответ

Может ли это быть сделано без использования именованного интерфейса, но с использованием аналогичной «анонимной» функции, как в 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()
6
Naman 20 Дек 2019 в 16:54
И это структура очереди:
 – 
Marek Pulka
20 Дек 2019 в 18:00
Вывод в порядке, я не понимаю, почему push (x) подталкивает все, кроме x
 – 
Marek Pulka
20 Дек 2019 в 18:06
1
Правда, для представления должен быть выведен тип. Даже если вы рассматриваете определение карты с инициализацией двойной скобки, такой как var conversions = new LinkedHashMap<String, UnaryOperator<Long>>() {{ put("byte", a -> (long) a.byteValue()); put("short", a -> (long) a.shortValue()); put("int", a -> (long) a.intValue()); put("long", a -> a); }};, вы не можете использовать метод byteValue() или подобные, если они не находятся на уровне класса Object.
 – 
Naman
20 Дек 2019 в 18:07
1
Понимание механизма рекурсивного вызова для реализации очереди с использованием стека
 – 
Marek Pulka
20 Дек 2019 в 18:26
1
У меня есть только одно изображение на человека для распознавания лиц. Можно ли создать другой ракурс и вид сбоку из существующего изображения фронтального вида
 – 
Naman
20 Дек 2019 в 18:33