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

如何在流中通过三元条件返回值?

詹杰
2023-03-14

我想根据条件返回一个流的值。仅以下面的例子为例,我想将任何苹果映射到< code >食物。苹果公司:

public enum Food {
    APPLE, APPLE2, APPLE3, BANANA, PINEAPPLE, CUCUMBER;

    private static final Food[] APPLES = new Food[] {APPLE, APPLE2, APPLE3};

    //java7
    public Food fromValue(String value) {
        for (Food type : Food.values()) {
            if (type.name().equalsIgnoreCase(value)) {
                return ArrayUtils.contains(APPLES, type) ? APPLE : type;
            }
        }
        return null;
    }

    //java8: how to include the array check for APPLES?
    public Food fromValue(String value) {
        return Arrays.stream(Food.values()).
            filter(type -> type.name().equalsIgnoreCase(value))
            .findFirst()
            .orElse(null);
    }
}

如何在流中包含三元条件?

共有3个答案

钱峻
2023-03-14

三元运算符没有什么特别之处。因此,您可以简单地将此映射操作添加Stream

public Food fromValue(String value) {
    return Arrays.stream(Food.values())
        .filter(type -> type.name().equalsIgnoreCase(value))
        .map(type -> ArrayUtils.contains(APPLES, type)? APPLE: type)
        .findFirst()
        .orElse(null);
}

但是,这些线性搜索都不是真正必要的。使用Map

public enum Food {
    APPLE, APPLE2, APPLE3, BANANA, PINEAPPLE, CUCUMBER;

    private static final Map<String,Food> MAP
        = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
    static {
       EnumSet<Food> apples=EnumSet.of(APPLE, APPLE2, APPLE3);
       apples.forEach(apple->MAP.put(apple.name(), APPLE));
       EnumSet.complementOf(apples).forEach(e->MAP.put(e.name(), e));
    }
    public static Food fromValue(String value) {
        return MAP.get(value);
    }
}

它将根据需要执行不区分大小写的查找,并首先初始化以返回< code>APPLE替代,因此不需要额外的比较。

澹台华翰
2023-03-14

正如Alexis所建议的,您可以使用地图操作

public Food fromValue_v8(String value) {
    return Arrays.stream(Food.values())
        .filter(type-> type.name().equalsIgnoreCase(value))
        .map(type -> ArrayUtils.contains(APPLES, type) ? APPLE : type)
        .findFirst()
        .orElse(null);
}
贲绪
2023-03-14

你可以这样做:

import static java.util.AbstractMap.SimpleImmutableEntry;

...

enum Food {
    APPLE, APPLE2, APPLE3, BANANA, PINEAPPLE, CUCUMBER;

    private static final Map<String, Food> MAP = Stream.concat(
                Stream.of(APPLE, APPLE2, APPLE3).map(e -> new SimpleImmutableEntry<>(e.name().toLowerCase(), APPLE)),
                Stream.of(BANANA, PINEAPPLE, CUCUMBER).map(e -> new SimpleImmutableEntry<>(e.name().toLowerCase(), e)))
            .collect(toMap(SimpleImmutableEntry::getKey, SimpleImmutableEntry::getValue));

    public static Food fromValue(String value) {
        return MAP.get(value.toLowerCase());
    }
}

地图中的查找将为 O(1)

 类似资料:
  • 我写一个函数,应该返回数组时,它是真和一个字符串时,假我第一次这样写:但是当myArry是空的,除了接收我得到一个空的arr,当我写,它工作,我不明白为什么? 下面我的代码:

  • 我当前正在过滤一个流,但是如果过滤器没有返回任何匹配项,我想返回一个默认值。这是在附加流的链中,所以我使用它来避免在一个步骤没有任何结果时链停止。 目前,我正在通过将筛选结果收集到一个列表中来伪造它,如果列表为空,请创建新的默认列表并将其作为流返回。如果列表不为空,则将结果转换回流以将其传递回。 有什么更流的方式来实现这一点,而不需要去列表和返回流?

  • 我一直在找这样的东西,但我找不到,所以就来了。 一些背景 我使用opencv从视频文件中检索帧。通常人们会无休止地循环这样做: 或 现在我想检索所有帧并在没有更多帧时退出循环。然而,我在python中的技能还不够强,无法做我想做的事情。 我想知道的是 函数(或方法,我不知道它们在python中是如何调用的)返回一个元组:首先代表操作成功,其次代表返回的帧。当元组的第一个元素为false时,我想打破

  • 我创建了一个扩展AsyncTask的AsynTaskInsideActivity类 位置\u id 我想从每一列中提取记录。因此,为了存储每个列的每个记录,我创建了四个类型数组(即每列一个),并成功地将检索到的光标数据存储在每个数组中。现在,问题是我需要返回每一列的记录。因此,具体地说,我如何从one-AsyncTask类返回这四个单独的List-type数组。目前,我只返回列表类型的数组,即lo

  • 问题内容: 我对Java没有太多的经验。我不确定这个问题是否很愚蠢,但是我需要从Firebase实时数据库中获取一个用户名,并通过此方法返回该名称。因此,我想出了如何获得该值,但是我不明白如何通过此方法返回它。最好的方法是什么? 问题答案: 这是异步Web API的经典问题。您现在无法返回尚未加载的内容。换句话说,您不能简单地创建一个全局变量并在onDataChange()方法外部使用它,因为它将

  • 问题内容: 以下(逻辑上)是编译时错误: 到目前为止,一切都很好。我不明白的是,以下内容是允许的: 为什么?认识到这对于编译器应该很简单,还是我在这里错过了一些关键点? (当然,如果在三元运算符中,一个以“空分支”结尾,那么它是一个NPE,还有什么?:) 问题答案: 三元条件运算符的类型由其第二和第三操作数的类型确定。 如果是 类型是,可以同时分配和。 编译器允许您的方法返回,因为它可以自动拆箱为