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
:一个简单的谓词
,如果任何成员对象满足所提供的条件(同样是布尔函数),它将返回trueanyMatch
提供了另一个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();
}