当前位置: 首页 > 知识库问答 >
问题:

如何将if-eles转换为Java8可选

米俊喆
2023-03-14

如何更改下面的代码以删除if-else并改用Java8Optional

public class IfTest {

    public static void main(String[] args) {
        String foodItem = "Apple";
        
        if(foodItem.equals("Apple") || foodItem.equals("A"))
            foodItem = "Fruit";
        else if(foodItem.equals("Potato") || foodItem.equals("P"))
            foodItem = "Vegetable";
        else 
            foodItem = "Food";
        
        System.out.println(foodItem);
    }
}

共有2个答案

郜彦
2023-03-14

可选的不是if-sterif-ster语句链的良好替代。您可能希望在给定食物组的类内的基于哈希的数据结构(如HashSet)中执行查找:

@Getter
@AllArgsConstructor         // basically getters and all-args constructor
public class FoodGroup {
    String name;
    Set<String> items;
}
List<FoodGroup> list = List.of(                            // I use Java-9+ static method
    new FoodGroup("Fruit", Set.of("Apple", "A")),          // for Java 8, use Arrays.asList(..)
    new FoodGroup("Vegetable", Set.of("Potato", "P")));


String foodItem = "Apple";

String result = list.stream()
                    .filter(group -> group.getItems().contains(foodItem))
                    .map(FoodGroup::getName)
                    .findFirst()
                    .orElse("Food");

对于这样一个简单的用例来说,这个解决方案可能有点过头了,但是,这个解决方案是可伸缩的。

罗安宁
2023-03-14

可选不是if/else的通用替代品。这不是一个好的选择。

我想你可以设法使用可选的这样的东西:

Optional.of(foodItem)
    .map(f -> f.equals("Apple") || f.equals("A") ? "Fruit" : f)
    .map(f -> !f.equals("Fruit") && (f.equals("Potato") || f.equals("P")) ? "Vegetable" : f)
    .filter(f -> !f.equals("Fruit") && !f.equals("Vegetable"))
    .orElse("Food");

这是一个完全不可读的混乱。

另一种选择是开关:这更好,因为它不会线性搜索所有案例,而是跳转到匹配的案例:

switch (foodItem) {
  case "Apple": case "A":
    foodItem = "Fruit"; break;
  case "Potato": case "P":
    foodItem = "Vegetable"; break;
  default:
    foodItem = "Food";
}

或开关表达式(在Java 12中):

foodItem = switch (foodItem) {
  "Apple", "A" -> "Fruit";
  "Potato", "P" -> "Vegetable";
  default -> "Food";
}

如果要使用Java 8中添加的功能,可以创建地图:

Map<String, String> map = new HashMap<>();
map.put("Apple", "Fruit");
map.put("A", "Fruit");
map.put("Potato", "Vegetable");
map.put("P", "Vegetable");

然后使用map.getOrDefault(Food,"Food")。这基本上只是开关的动态形式。

 类似资料: