Consumer и дженерики

tox1cozZ

aka Agravaine
8,456
598
2,893
Приходится писать много одинакового кода аля:
Java:
if(mc.currentScreen instanceof GuiSocialNetwork){
                GuiSocialNetwork gui = (GuiSocialNetwork)mc.currentScreen;
                Optional<GuiTab> currentTab = gui.getCurrentTab();
                currentTab.ifPresent(tab -> {
                    if(tab instanceof GuiTabAllReports){
                        GuiTabAllReports reportsTab = (GuiTabAllReports)tab;
                        // ...
                    }
                });
            }
Решил вынести это в отдельный метод:
Код:
public static void onTab(Minecraft mc, Class<? extends GuiTab> tabClass, Consumer<? super GuiTab> consumer){
        if(mc.currentScreen instanceof GuiSocialNetwork){
            GuiSocialNetwork gui = (GuiSocialNetwork)mc.currentScreen;
            Optional<? extends GuiTab> currentTab = gui.getCurrentTab();
            currentTab.ifPresent(tab -> {
                if(tabClass.isAssignableFrom(tab.getClass())){
                    consumer.accept(tab);
                }
            });
        }
    }
Ну и юзаю вот так:

Код:
GuiSocialNetwork.onTab(mc, GuiTabAllReports.class, tab -> {
                GuiTabAllReports reports = (GuiTabAllReports)tab;
            });
Только вот 'tab' имеет тип GuiTab, приходится постоянно кастить к нужному типу.
Вопрос: можно ли как-то сделать так, чтобы 'tab' был типа передаваемого класса(GuiTabAllReports.class)?
 
1,015
9
102
Java:
public static <T extends GuiTab> void onTab(Minecraft mc, Class<T> tabClass, Consumer<T> consumer){
        if(mc.currentScreen instanceof GuiSocialNetwork){
            GuiSocialNetwork gui = (GuiSocialNetwork)mc.currentScreen;
            Optional<T> currentTab = gui.getCurrentTab();
            currentTab.ifPresent(tab -> {
                if(tabClass.isAssignableFrom(tab.getClass())){
                    consumer.accept(tab);
                }
            });
        }
    }
 
Это лямбды. Они могут быть переданы в качестве параметра вместо функциональных интерфейсов. Небольшое упрощение кода только и всего.
небольшой пример
1528383111517.png
1528383122908.png
1528383133431.png


или еще есть интересная очень штука похожая на лямбды) что-то типа передачи метода как параметра, но не совсем
1528383308660.png
1528383317573.png
 
2,505
81
397
А зачем Optional? Чтобы еще одну лямбду создать после этого?
 

Icosider

Kotliner
Администратор
3,603
99
664
Это лямбды. Они могут быть переданы в качестве параметра вместо функциональных интерфейсов. Небольшое упрощение кода только и всего.
небольшой пример
Посмотреть вложение 2254
Посмотреть вложение 2255
Посмотреть вложение 2256


или еще есть интересная очень штука похожая на лямбды) что-то типа передачи метода как параметра, но не совсем
Посмотреть вложение 2257
Посмотреть вложение 2258
Эм, вообще то любой интерфейс можно, а не только функциональный. Даже функциональныйИнтерфейс писать не надо.
 
Эм, вообще то любой интерфейс можно, а не только функциональный
-_- Советую поучить жаву. Только функциональные.
Даже функциональныйИнтерфейс писать не надо.
Это стилистика кода. Тоже самое что и Override;
 

Icosider

Kotliner
Администратор
3,603
99
664
Вот именно. Только если ты хочешь " () -> "Test" ", то тогда можно и одним методом обойтись, но этим можно и не ограничиваться, сделать к примеру так:
Java:
public class Test
{
    public static void main(String[] args)
    {
        println(new CallMe() {
            @Override
            public Integer text() {
                return 123;
            }

            @Override
            public String zalupa() {
                return "Test 1";
            }
        });
        println(() -> "Test 2");
    }

    static void println(CallMe callMe)
    {
        System.out.println(callMe.text());
    }

    static void println(CallMeTo callme)
    {
        System.out.println(callme.text());
    }

    interface CallMe<T>
    {
        T text();

        String zalupa();
    }

    @FunctionalInterface
    interface CallMeTo
    {
        String text();
    }
}
А ещё твой функционалИнтерфейс(аннотация) не для "стилистики кода" сделана. В случаи если у тебя будет больше одного метода, то компилятор кинет эксепшен, что данный интерфейс не является функциональным.

И в первом своём сообщении я говорил про то, что "инициализировать" интерфейс можно любой, а не только функциональный.
 
Последнее редактирование:
А ещё твой функционалИнтерфейс(аннотация) не для "стилистики кода" сделана. В случаи если у тебя будет больше одного метода, то компилятор кинет эксепшен, что данный интерфейс не является функциональным.
Спасибо, я и сам читать умею, а еще я об этом писал
Тоже самое что и Override;
 
7,099
324
1,510
Сверху