如何更改下面的代码以删除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);
}
}
可选的
不是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");
对于这样一个简单的用例来说,这个解决方案可能有点过头了,但是,这个解决方案是可伸缩的。
可选
不是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")
。这基本上只是开关的动态形式。
我正在查看的文档,我看到了方法,但无法直接转到 是否有方法将转换为?
在Java8中,如何将(在中)转换为(在中)?
问题内容: 我刚刚开始使用Java 8,并且正在使用以下代码片段: 如何将其转换为Lambda样式? 问题答案: 如果是 功能界面 ,则可以 这是您问题中其他类的存根实现的完整示例:
我想用可选的。由于只能连接流,我有以下问题: 如何将可选 转换为流 ? 示例:
我是java.time包的新手。我有一个本地日期是2015-12-10。我需要将此转换为ZonedDateTime。时间应该是00:00:00,区域是zoneoffset.utc。 dateTimeException:无法从java.time.localDate类型的TemporalAccessor:2015-12-10获取Instant 我也试过: 这会产生意想不到的结果。 我查看了API并尝试