Лямбда-выражение, как передать метод в качестве параметра в пользовательский метод - PullRequest
0 голосов
/ 17 мая 2018

Я работаю над личным проектом, и обнаружил, что я могу дублировать меньше кода, если применить лямбду.

Итак, текущий код выглядит так:

public UserDto findByUsernameAndPassword(String username, char[] password) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return bean.findByUsernameAndPassword(username, password);
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

public List<CategoryDto> getAllCategories(){
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return bean.getAllCategories();
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

Как вы видите оба методаотличаются только возвращаемым типом и методом в операторе возврата.Поэтому я почти уверен, что лямбда может помочь мне очистить код, но, к сожалению, я не могу понять эту тему.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Чтобы воспользоваться лямбда-выражениями (или ссылками на методы), вы должны попытаться выяснить, как разница между этими двумя методами может быть выражена с помощью функционального интерфейса (т. Е. Интерфейса, имеющего один метод).

Оба ваших метода получают возвращаемое значение из экземпляра IFrontControllerRemote.Следовательно, универсальный метод может принять Function<IFrontControllerRemote,T>, где T представляет возвращаемое значение.Экземпляр Function<IFrontControllerRemote,T> примет IFrontControllerRemote и вернет требуемое значение.

public <T> T getProperty(Function<IFrontControllerRemote,T> retriever) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);
        return retriever.apply(bean);
    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

Теперь для вызова метода:

UserDto user = getProperty (b -> b.findByUsernameAndPassword(username, password));

List<CategoryDto> list = getProperty (IFrontControllerRemote::getAllCategories);
0 голосов
/ 17 мая 2018

Вы можете создать универсальный метод

private <T> queryBean(Function<IFrontControllerRemote,T> transform) {
    Properties props = new Properties();
    props.put("java.naming.factory.url.pkgs","org.jboss.ejb.client.naming");

    try {
        InitialContext ctx = new InitialContext(props);
        String ejbUrl = "ejb:ShopManagmentEAR/ShopManagmentEJB//FrontController!"+IFrontControllerRemote.class.getName();

        IFrontControllerRemote bean = (IFrontControllerRemote) ctx.lookup(ejbUrl);

        return transform.apply(bean);

    } catch (NamingException e) {
        System.out.println("error");
        e.printStackTrace();
    }
    return null;
}

со звонками

return queryBean(bean -> bean.findByUsernameAndPassword(username, password));

и

return queryBean(bean::getAllCategories);

соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...