Передать ссылку на метод вместо значения (или что-то в этом роде) - JAVA - PullRequest
1 голос
/ 25 сентября 2019

У меня есть несколько объектов со значением, сохраненным в -

object.getList().get(0).getSomeObject.getName(0)

Возможно, этот список пуст, поэтому

object.getList().get(0)

выбрасывает NPE

Я хочупередать-

object.getList().get(0).getSomeObject.getName()

другому методу и обработать исключение там.

Например:

// calling the method
myMethod(object.getList().get(0).getSomeObject.getName());

public void myMethod(Object o){
    try {
        String name = o;
    }catch (Exception e){
        // do something
    }
}

Возможно ли это сделатькак то так -

EvaluateLaterObject elo = new EvaluateLaterObject(object.getList().get(0).getSomeObject.getName());
myMethod(elo);

public void myMethod(EvaluateLaterObject elo){
    try {
        String name = elo.getValue();
    }catch (Exception e){
        // do something
    }
}

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вы можете использовать функциональный интерфейс, такой как Supplier и лямбда

myMethod(() -> object.getList().get(0).getSomeObject.getName());

public void myMethod(Supplier<String>){
    try {
        String name = elo.get();
    }catch (Exception e){
        // do something
    }
}

Если вы хотите поддержать любое исключение, вам нужно определить свой собственный функциональный интерфейснапример,

@FunctionalInterface
interface ThrowableSupplier<T>
{
    T get() throws Throwable;
}
1 голос
/ 25 сентября 2019

Либо то, что уже было дано Майклом

Supplier<String> objectSupplier = () -> object.getList().get(0).getSomeObject.getName();

public void myMethod(Supplier<String> objectSupplier){
    try {
        String name = objectSupplier.get();
    }catch (Exception e){
        // do something
    }
}

, которое на самом деле не обрабатывает исключение.

Или используйте опциональность.Предполагая, что элементы списка имеют класс ListItem, а getSomeObject имеет класс Item:

Optional<String> nameOpt = object.getList().stream()  // Stream<ListItem>
        .findFirst()                                  // Optional<ListItem>
        .map(ListItem::getSomeObject)                 // Optional<Item>
        .map(Item::getName);                          // Optional<String>

public void myMethod(Optional<String> nameOpt){
    nameOpt.ifPresent(name -> System.out.println(name));
    String nm = nameOpt.orElse("(No Name)");
}
...