简体   繁体   中英

how to convert else if in java8

How to change the below code to remove if-else and use Java8

List<String> list1;
List<String> list2;
List<String> list3;
String str;
if(list1.contains(str)){
    event.getMessage().setInvocationProperty("ABC","ABC1");
}
else if(list2.contains(str)){
    event.getMessage().setInvocationProperty("ABC2","ABC3");
}
else if(list3.contains(str)){
    event.getMessage().setInvocationProperty("ABC4","ABC5");
}

Here is how to do it by creating what I'll call a HoldingObject , but you can name it with something more close to your business.

I'm using Lombok's @Value annotation and also 's List#of factory method

@Value
public static class HoldingObject {
    List<String> list;
    String invocationProperty1;
    String invocationProperty2;

    public void setInvocationPropertyFor(Event event) {
        event.getMessage().setInvocationProperty(invocationProperty1, invocationProperty2);
    }
}

Note that doing event.getMessage() repeatedly might not be thread-safe if event is accessed through multiple threads

HoldingObject firstObject = new HoldingObject(list1, ABC, ABC1);
HoldingObject secondObject = new HoldingObject(list1, ABC2, ABC3);
HoldingObject thirdObject = new HoldingObject(list1, ABC4, ABC5);

List.of(firstObject, secondObject, thirdObject)
    .stream()
    .filter(object -> object.getList().contains(str))
    .findFirst()
    .ifPresent(h -> h.setInvocationPropertyFor(event));

It is possible to do it without if-else , but for this case, if-else would still be better than using streams.

List<String> list1;
List<String> list2;
List<String> list3;
String str;
Map<List<String>, List<Param>> paramMap = new HashMap<>();
paramMap.put(list1,List.of(ABC,ABC1));
paramMap.put(list2,List.of(ABC2,ABC3));
paramMap.put(list3,List.of(ABC4,ABC5));

List.of(list1,list2,list3)
    .stream()
    .filter(list -> list.contains(str))
    .findFirst()
    .ifPresent(list -> event.getMessage().setInvocationProperty(paramMap.get(list).get(0),paramMap.get(list).get(1)));

Another solution without using the list as key in paramMap :

Map<Integer, List<Param>> paramMap = new HashMap<>();
paramMap.put(1,List.of(ABC,ABC1));
paramMap.put(2,List.of(ABC2,ABC3));
paramMap.put(3,List.of(ABC4,ABC5));
List<List<String>> lists = List.of(list1,list2,list3);
List<String> mList = lists.stream()
                          .filter(list -> list.contains(str))
                          .findFirst()
                          .ifPresent(list -> {
    Integer index = Integer.valueOf(lists.indexOf(list));     
    event.getMessage()
         .setInvocationProperty(paramMap.get(index).get(0),paramMap.get(index).get(1))
    });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM