我想将字符串数组与对象集进行比较,其中对象具有字符串字段。然后返回等于给定字符串的对象。但是我想尽可能避免每个循环。
任何想法我该如何使用流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);
}
}
}
答案 0 :(得分:3)
我首先要强调的是,在每个循环中使用都没错。使用流甚至可能会带来一些开销。
也就是说,对流进行处理的一种方法是:
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());
答案 1 :(得分:-2)
您正在将字符串与错误的对象进行比较。在内部for-each循环中,您正在循环访问ObjectToReturn,该对象为空。要解决此问题,只需更改:
for (TestObj testObj : objectsToReturn) {
收件人:
for (TestObj testObj : allObjects) {