Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换数组并将其复制到列表中_Java_Arraylist_Enums_Java 8 - Fatal编程技术网

Java 转换数组并将其复制到列表中

Java 转换数组并将其复制到列表中,java,arraylist,enums,java-8,Java,Arraylist,Enums,Java 8,明确地说,我没有任何问题,也不真正需要帮助,但我还是想问: 假设我们有一个字符串数组 String[] sarr = new String[]{"POTATO", "TOMATO"}; 我们有一个枚举 public enum Food{POTATO, TOMATO, PIZZA} 如果我想检查sarr中的所有字符串是否都出现在Food中,我会执行以下操作: ArrayList<String> foodstrings = new ArrayList<>(); Array

明确地说,我没有任何问题,也不真正需要帮助,但我还是想问:

假设我们有一个字符串数组

String[] sarr = new String[]{"POTATO", "TOMATO"};
我们有一个枚举

public enum Food{POTATO, TOMATO, PIZZA}
如果我想检查
sarr
中的所有字符串是否都出现在
Food
中,我会执行以下操作:

ArrayList<String> foodstrings = new ArrayList<>();
Arrays.asList(Food.values()).forEach((in) -> foodstrings.add(in.toString()));
if (!foodstrings.containsAll(Arrays.asList(sarr))) doStuff();
ArrayList foodstrings=new ArrayList();
Arrays.asList(Food.values()).forEach((in)->foodstrings.add(in.toString());
if(!foodstrings.containsAll(Arrays.asList(sarr)))doStuff();
有没有一种方法可以在更少的代码行中实现这一点?还是更优雅的方式

if (Stream.of(sarr).allMatch(s -> Stream.of(Food.values()).anyMatch(t -> s.equals(t.name()))))
{ 
    // all match
}
  • sarr
    创建一个流(可以是符合Java 1.8中引入的
    API的对象的任何
    集合
  • 我们要求提供值
    allMatch
    ,该值仅在
    谓词
    时返回
    true
    (即返回true/false的函数)
  • 对于
    allMatch
    所期望的
    谓词
    ,我们提供了一个lambda,它通过一个流在第二组对象上迭代,并调用
    anyMatch
    :一个简单的
    谓词
    ,如果任何成员对象满足所提供的条件(同样是布尔函数),它将返回true
  • 我们为
    anyMatch
    提供了另一个lambda,它通过
    equals
    实现对两个集合的成员进行比较 这个解决方案在语义上等价于不变量

    A\B子集

    在我们的例子中是

    sarr\subset Food.values()

    以下Java<1.8代码如下所示,通过短路模拟规范(减去流开销):


    当然,您可以替换不同的收集类型和条件,也可以使用
    parallelStream()
    更好地利用可用的硬件。

    您需要确定数组中的所有元素是否都包含在食物名称列表中

    一种可能的解决方案是将食品名称转换为
    集合
    (要有一个O(1)
    包含
    );然后,我们需要确定数组中的所有元素是否都包含在此集合中:

    public static void main(String[] args) {
        String[] sarr = new String[]{"POTATO", "TOMATO"};
        Set<String> set = Arrays.stream(Food.values()).map(Enum::name).collect(Collectors.toSet());
        boolean result = Arrays.stream(sarr).allMatch(set::contains);
    }
    
    publicstaticvoidmain(字符串[]args){
    字符串[]sarr=新字符串[]{“土豆”、“西红柿”};
    Set Set=Arrays.stream(Food.values()).map(Enum::name).collect(Collectors.toSet());
    布尔结果=Arrays.stream(sarr).allMatch(set::contains);
    }
    


    在您当前的解决方案中,您正在使用forEach对外部变量进行变异,这是一种不好的做法。

    我认为前两行的更好版本是:

    Set<String> foodstrings = Arrays.stream(Food.values()).map(Enum::name).collect(Collectors.toSet());
    

    非常感谢你!最后我同意你的回答,但图纳基的回答也很有帮助。
    Set<String> foodstrings = Arrays.stream(Food.values()).map(Enum::name).collect(Collectors.toSet());
    
    if (! Arrays.stream(Food.values())
                .map(Enum::name)
                .collect(Collectors.toSet())
                .containsAll(Arrays.asList(sarr))) {
        doStuff();
    }