根据以前的答案,特别是来自@Alexis,我编写了一些代码来检查展台方法(从Java 7和Java 8)。也许这对于Java 8上的新用户可能是有用的。
因此,我对原始答案进行了一些更改。首先,我把一些单元测试,我加了两个包装方法verifyNames()和包含()。其次,当意外发生时的行动,我们可以使用一个默认行为,在这种情况下,当appleApproachTwo.fromValueJava8()被称为与空或不存在枚举值。
最后,最后一次更改使用java.util.Optional对象的潜在用途。在这种情况下,我们可以保护环境因与空对象不一致而崩溃。大约有默认值,可选和否则容易()方法Default Values and Actions
public enum Food {
APPLE, APPLE2, APPLE3, BANANA, PINEAPPLE, CUCUMBER, NONE;
private static final Food[] APPLES = new Food[] {APPLE, APPLE2, APPLE3};
// approach one
// java7: conventional use
public Food fromValueJava7(String value) {
for (Food type : Food.values()) {
if (verifyNames(type, value)) {
return contains(Food.APPLES, type) ? Food.APPLE : type;
}
}
return null;
}
// approach two
// java8: how to include the array check for APPLES?
public Food fromValueJava8(String value) {
return Arrays.stream(Food.values())
.filter(type-> verifyNames(type, value))
.map(type -> contains(Food.APPLES, type) ? Food.APPLE : type)
.findFirst()
.orElse(Food.NONE);
}
private boolean contains(Food[] apples, Food type) {
return ArrayUtils.contains(apples, type);
}
private boolean verifyNames(Food type,String other) {
return type.name().equalsIgnoreCase(other);
}
}
// FoodTest
//
public class FoodTest {
@Test
public void foodTest(){
Food appleApproachOne = Food.APPLE;
// from approach one
assertEquals(appleApproachOne.fromValueJava7("APPLE"), Food.APPLE);
assertEquals(appleApproachOne.fromValueJava7("APPLE2"), Food.APPLE);
assertEquals(appleApproachOne.fromValueJava7("APPLE3"), Food.APPLE);
assertEquals(appleApproachOne.fromValueJava7("apple3"), Food.APPLE);
assertNull (appleApproachOne.fromValueJava7("apple4"));
assertNull (appleApproachOne.fromValueJava7(null));
Food appleApproachTwo = Food.APPLE;
//from approach two
assertEquals(appleApproachTwo.fromValueJava8("APPLE"), Food.APPLE);
assertEquals(appleApproachTwo.fromValueJava8("APPLE2"), Food.APPLE);
assertEquals(appleApproachTwo.fromValueJava8("APPLE3"), Food.APPLE);
assertEquals(appleApproachTwo.fromValueJava8("apple3"), Food.APPLE);
assertEquals(appleApproachOne.fromValueJava8("apple4"), Food.NONE);
assertEquals(appleApproachTwo.fromValueJava8(null), Food.NONE);
}
}
来源
2015-03-25 18:58:18
EAA
更多讨论,那么你可以使用'map'里面的条件。 – 2015-03-25 12:54:16
@AlexisC。好的,谢谢,你可能是指'.map(type - > ArrayUtils.contains(APPLES,type)?APPLE:type)'?如果是这样,如果这是最好的解决方案,你可以添加它作为答案。 – membersound 2015-03-25 12:56:31
而私人静态final HashSet APPLES = new HashSet <>(Arrays.asList(“apple”,“apple2”,“apple3”));''''和'public static Food fromValue(String value){ 返回APPLES.contains(value.toLowerCase())? APPLE:null; }'?时间复杂,编写代码少。 –
2015-03-25 13:03:34