我想将字符串数组与对象集的集合进行比较,其中对象具有字符串字段。然后返回等于给定字符串的对象。但是,如果可能的话,我想避免每个循环。
任何想法我该如何使用流API?
所以让我粘贴一些示例代码:
class TestObj {
private String str;
private String name;
public TestObj(String str, String name) {
this.setStr(str);
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
实际代码是:
Set<TestObj> allObjects = new HashSet<>();
allObjects.add(new TestObj("s", "aaa"));
allObjects.add(new TestObj("d", "uuu"));
allObjects.add(new TestObj("a", "ggg"));
allObjects.add(new TestObj("c", "dd"));
String[] arr = {"a", "b", "e", "f"};
Set<TestObj> objectsToReturn = new HashSet<>();
for (String string : arr) {
for (TestObj testObj : objectsToReturn) {
if(string.equals(testObj.getStr())) {
objectsToReturn.add(testObj);
}
}
}
我想首先强调对每个循环做到这一点没有错误的。使用流甚至可能引入一些开销。
也就是说,一种使用流的方法是:
String[] arr = {"a", "b", "e", "f"};
List<String> arrList = Arrays.asList(arr); // create a List from the array so that we can call "contains".
// If the array is constant, you should just directly create a List instead.
Set<TestObj> objectsToReturn =
allObjects.stream()
.filter(x -> arrList.contains(x.getStr()))
.collect(Collectors.toSet());
如果您的数组被排序,则不需要List
,并且可以调用binarySearch
查看数组是否包含元素:
Set<TestObj> objectsToReturn =
allObjects.stream()
.filter(x -> Arrays.binarySearch(arr, x.getStr()) >= 0)
.collect(Collectors.toSet());
您将字符串与错误的对象进行比较。在内部的面孔循环中,您是通过对objectstoreturn进行迭代的,该绕线是空的。要修复它,只需更改:
for (TestObj testObj : objectsToReturn) {
to:
for (TestObj testObj : allObjects) {