powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Тяпничный pattern matching for switch в JDK 17
25 сообщений из 25, страница 1 из 1
Тяпничный pattern matching for switch в JDK 17
    #40103168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет котаны-бротаны!

На дворе стоит пятница и JDK 17. А значит пора обсудить сабж.
Не прошло и 25 лет как нам в синтасис наконец-то завезли нужну вешь.

Не хочу копи-пастить хабр. Вот тут обзорная статья https://habr.com/ru/post/579178/

Пару мыслей.

1) В своих экспериментах с bigdata я часто использовал подобную конструкцию

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}


Только в старом варианте с if-else.

И здесь с одной стороны стояли JDBC types а с другой - Apache ORC и наоборот.

Вобщем пора рефакторить.

Что у вас в продуктовом коде? Как повлияет на качество новое улучшение.

2) Не совсем я согласен с предлагаемой терминологией. Мне кажется что pattern-matching
для функций - это достаточно старый термин. Гораздо старее чем Java. И в функциональном
программировании он - немного шире чем предлагают в JEP.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103170
Ого.. Это улучшение сэкономит в среднем аж 10 строк на проект. Киллер-фича, моя жизнь никогда не станет прежней :)
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103228
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
я уже давал про это 22374782
почитай реакцию..... 22374863
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103230
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще субъективизм зашкаливает
mayton
1) В своих экспериментах с bigdata я часто использовал подобную конструкцию


Basil A. Sidorov- типичный пример неумения думать
Автор страдает ...
static String formatter(Object o) {
String formatted = "unknown";
if (o instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (o instanceof Long l) {
formatted = String.format("long %d", l);
} else if (o instanceof Double d) {
formatted = String.format("double %f", d);
} else if (o instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
... и цепочка вложенных if это (действительно) ужасно.
Но почему эти страдающие перфекционисты не в состоянии переписать цепочку в блок:
static String formatter(Object o) {
if (o instanceof Integer i) {
return String.format("int %d", i);
};
if (o instanceof Long l) {
return String.format("long %d", l);
};
if (o instanceof Double d) {
return String.format("double %f", d);
};
if (o instanceof String s) {
return String.format("String %s", s);
}
return "unknown";
}
?
Оно, конечно, тоже громоздкое, но это хотя бы "Die erste Kolonne marshiert ..." и не требует ломать голову над вопросом - "А нафига тут вложенность? Оптимизация выхода? Серьёзно???"

P.S.
Когда я вижу аргументацию такого качества, хочется спросить: вы действительно считаете свои аргументы убедительными?


когда я писал что хибер не есть использовать для смены субд - мне возражали , наоборот позволяет в проектах просто менять субд, как один из аргументов за хибер.
теперь же 22381259

PetroNotC SharpНикто бд особо не меняет.
22381507
Basil A. SidorovТо, что размещается в JDBC URL после знака вопроса - параметры, специфичные для JDBC-драйвера конкретной базы.
Следовательно, вам необходимо открыть документацию PostreSQL JDBC-драйвера и п(р)очитать её.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103248
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы пишите костыли с применением антипаттерна 'instance of'. Некоторые знают, что есть полиморфизм, но забывают им пользоваться.
Код: sql
1.
2.
3.
4.
5.
6.
7.
public class Formatter {
        public static String fortmat(Integer i) {return String.format("int %d", i);}
        public static String fortmat(Long l) {return String.format("long %d", l);}
        public static String fortmat(Double d) {return String.format("double %f", d);}
        public static String fortmat(String s) {return String.format("String %s", s);}
        public static String fortmat(Object o) {return o.toString();}
}
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103249
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял свою ошибку, не будет это работать, т.к. связывание при перегрузке статичное.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103267
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
теперь же

че за хилая аргументация, сменить JDBC URL по-твоему так же тяжело, как переписать стопицот запросов?
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40103278
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в Java нет полиморфизма из коробки при перегрузке методов (что в общем-то странно, нетрудно ведь сделать), то реализуем полиморфизм сами, как-то так. 'Instance of' все таки антипаттерн и желательно его заменить полиморфизмом.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    static Map<Object, Function<Object, String>> formatMap = Map.of(
            Integer.class, (i) -> String.format("int %d", i),
            Long.class, (l) -> String.format("long %d", l),
            Double.class, (d) -> String.format("double %f", d),
            String.class, (s) -> String.format("String %s", s)
    );

    public static String format(Object o) {
        if (o == null) {
            return null;
        }
        Function<Object, String> function = formatMap.get(o.getClass());
        return function == null ? o.toString() : function.apply(o);
    }
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40106012
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему поводу терминологии. Вот так выглядит pattern-matching в Haskell.

Код: java
1.
2.
3.
4.
5.
:{
fact 0 = 1
fact 1 = 1
fact x = x * fact (x - 1)
:}



Определено 3 функции. На самом деле одна. Просто для разных аргументов. Конечно в Java завялено
что это pattern matching для switch.

Хорошо. Давайте более дискретный вариант чтобы switch неявно был.

Код: java
1.
2.
3.
4.
weekday 0 = "Monday"
weekday 1 = "Tuesday"
....
weekday 6 = "Sunday"



Тоже паттерн матчинг функций.

Вот еще интересный кейс. Просто берем левый или правый аргумент.

Код: java
1.
2.
3.
4.
:{
left x _ = x
right _ y = y
:}
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40106497
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Привет котаны-бротаны!

На дворе стоит пятница и JDK 17. А значит пора обсудить сабж.
Не прошло и 25 лет как нам в синтасис наконец-то завезли нужну вешь.

Не хочу копи-пастить хабр. Вот тут обзорная статья https://habr.com/ru/post/579178/

Пару мыслей.

1) В своих экспериментах с bigdata я часто использовал подобную конструкцию

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}


Только в старом варианте с if-else.

И здесь с одной стороны стояли JDBC types а с другой - Apache ORC и наоборот.

Вобщем пора рефакторить.

Что у вас в продуктовом коде? Как повлияет на качество новое улучшение.

2) Не совсем я согласен с предлагаемой терминологией. Мне кажется что pattern-matching
для функций - это достаточно старый термин. Гораздо старее чем Java. И в функциональном
программировании он - немного шире чем предлагают в JEP.

так это неполноценный патмат. если вообще это патматом можно назвать.

вот допустим у меня есть сущность юзер. с полем имя фамилия телефон и адрес.

и как мне с этим патматом написать скажем такой кейс Юзер(где имя = вася фамилия = иванов адрес = все равно телефон = все равно) -- как мы с этим недопатматчем засунем туда этот кейс? ответ - при такой реализации вероятно никак.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40106515
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
static String formatUserOrElse(Object o) {
        return switch (o) {
            case User u && "вася".equals(u.getSname()) && "555".equals(u.getPhone()) -> "Habba-habba! Vasya! : " + u.toString();            
            default -> "Who are you?";
        };
}
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108323
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень крутая фича в сочениии с sealed class

обычно раньше использовали Enum так как инстанс офф это дорого,теперь это на уровне языка и это офигенно ,а еще офигенно и тем,что в момент рефакторинга джун будет должен описать все юзкейсы иначе код не скопмпилируется и это тоже очень круто

а еще круто это рекорды - не нужно тащить завиисимоти лишние чтобы полуить функционал с анотациями ломбока( который кстати не совсем корректно сейчас работает на 17)
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108330
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: java
1.
2.
3.
4.
5.
6.
static String formatUserOrElse(Object o) {
        return switch (o) {
            case User u && "вася".equals(u.getSname()) && "555".equals(u.getPhone()) -> "Habba-habba! Vasya! : " + u.toString();            
            default -> "Who are you?";
        };
}


ого. круто хочу.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108337
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}




надо понимать что твой код не скомпилируется ,так как ты должен обозначить всех наследников класса Object в кейсах
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108362
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
ого. круто хочу.

Это - рабочий код в JDK-17
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108364
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
localhost8080

надо понимать что твой код не скомпилируется ,так как ты должен обозначить всех наследников класса Object в кейсах

Это - тоже работает. Возможно ты до этого читал про особенности использования Sealed classes.
Но Object не объявлен как Sealed и следовательно на него нет строгих ограничений по подтипам.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108385
localhost8080
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
\
Это - тоже работает. Возможно ты до этого читал про особенности использования Sealed classes.
Но Object не объявлен как Sealed и следовательно на него нет строгих ограничений по подтипам.

Ты ошибаешься - убери default и получишь ошибку компиляции- так как не покрыл все возможнные реализации класса Object)
тоже самое будет касаться и такой иерархии

Код: java
1.
public  sealed class Animal permits Cat,Bird,Dog {



Код: java
1.
2.
3.
4.
5.
6.
 static String newSwitch(Animal a){
        return switch (a){
            case Bird i->i.toString();
            default -> "wefwefwf";
        };
    }



как видишь хоть и явно указны ограничения по подтипам это ничего не меняет - ты либо доллжен релизовать всех наследников,либо прописать дефолт
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108390
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем варианте использования я все равно не мог покрыть все типы. Да и незачем это было.
Для default-секции я просто писал log.warn("Unrecognized dbms datatype received...") и далее
- по ситуации я фиксил. Всё равно поддержать все типы данных PG или Oracle было сложно.
Да и кому надо поддерживать Oracle/RAW или PG-географические типы?
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108401
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
log.warn("Unrecognized dbms datatype received...") и далее
обычно райзе наверх бросаю.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40108518
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещеб онфейлов добавили бы в стримах и прочих обертках типа опшина
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40109249
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaT
ещеб онфейлов добавили бы в стримах и прочих обертках типа опшина

А как ты себе представляешь обработку эксцепшена в стриме?
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40109401
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут мне кажется есть какой-то слом парадигм. Я-бы разделял опасные операции и безопасные.
Причем опасные должны иметь логику retry для спасения нужных данных от потерь.
Пример - акторная технология. Актор принимает сообщение. Процессит. Падает по ошибкам
IO. Супервизор видит что актор упал и снова перезапускает его. При этом сообщение
в очереди то что было не обработано до конца - не теряется.

И мне кажется что какая-то любая упрощенная логика здесь не верна. Например прервать
весь stream - нельзя. Мы потеряем его состояние и часть месседжей которые уже в стрим
были заложены.

Оборачивать Optional - это по сути игнорировать ошибки I/O и тоже упускать что-то.

Я-бы сказал - если хотите Stream - изолируйте опасную логику от безопасной.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40109588
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
andreykaT
ещеб онфейлов добавили бы в стримах и прочих обертках типа опшина

А как ты себе представляешь обработку эксцепшена в стриме?

меня бы устроило как в скалке. он фейл бла бла бла.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40109589
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тут мне кажется есть какой-то слом парадигм. Я-бы разделял опасные операции и безопасные.
Причем опасные должны иметь логику retry для спасения нужных данных от потерь.
Пример - акторная технология. Актор принимает сообщение. Процессит. Падает по ошибкам
IO. Супервизор видит что актор упал и снова перезапускает его. При этом сообщение
в очереди то что было не обработано до конца - не теряется.

И мне кажется что какая-то любая упрощенная логика здесь не верна. Например прервать
весь stream - нельзя. Мы потеряем его состояние и часть месседжей которые уже в стрим
были заложены.

Оборачивать Optional - это по сути игнорировать ошибки I/O и тоже упускать что-то.

Я-бы сказал - если хотите Stream - изолируйте опасную логику от безопасной.

стрим и опшинал это по сути одно и то же. онфейл изобразить обрабатыванием опасности внутри динозавром трайкачем из конца восьмидесятых тоже можно и все знают как это работает. но хочется чего то более нормального. во первых онфейла во вторых обертки которая умеет трай или мейби. все это в жаве есть и даже не страшное. но не из коробки.
...
Рейтинг: 0 / 0
Тяпничный pattern matching for switch в JDK 17
    #40119270
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
четверговый доклад.
Хоть и скороговоркой, но высокой степени адекватности.
Для субботнего просмотра тоже годится.

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Тяпничный pattern matching for switch в JDK 17
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]