[英]How to get unique rows using SET class from an Arraylist of “Arraylist string objects” of Type Setters & Getters class
[英]How to get an String and the ArrayList stored in a Arraylist of objects of a class using Java stream
我已經修改了代碼,並嘗試在特定條件下(例如'str'字符串等於2)獲取ArrayList和存儲在對象的Arraylist中的字符串。 我無法將Stream轉換為ArrayList。 請幫助我了解從該流中獲取ArrayList需要做什么。
我有一個類“ SampleClass”,如下所示:
import java.util.ArrayList;
public class SampleClass {
String str;
ArrayList<String> al;
String check;
public SampleClass(String str, ArrayList<String> al, String check) {
super();
this.str = str;
this.al = al;
this.check = check;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public ArrayList<String> getAl() {
return al;
}
public void setAl(ArrayList<String> al) {
this.al = al;
}
public String getCheck() {
return check;
}
public void setCheck(String check) {
this.check = check;
}
}
我有另一個類“ GetTheArrayListStoredInAnotherArrayList”,如下所示,在這里我試圖獲取存儲在對象ArrayList中的ArrayList。 請糾正我錯的地方。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
public class GetTheArrayListStoredInAnotherArrayList{
public static void main(String[] args) {
String test = "qw,rer,try,try,erh5,wertgw45t,45";
ArrayList<String> al = new ArrayList<String>();
al.addAll(new ArrayList<String>(Arrays.asList(test.split(","))));
System.out.println(al);
ArrayList<SampleClass> sca = new ArrayList<SampleClass>();
SampleClass sc1 = new SampleClass("1", al,"ch1");
SampleClass sc2 = new SampleClass("2", al,"cc2");
SampleClass sc3 = new SampleClass("3", al,"fr3");
SampleClass sc4 = new SampleClass("4", al,"fg4");
sca.add(sc1);
sca.add(sc2);
sca.add(sc3);
sca.add(sc4);
ArrayList<String> als1 = null;
ArrayList<String> als = sca.stream().filter( s -> s.getStr().equals("2")).flatMap(sc -> sc.getAl().stream()).collect(Collectors.toCollection(ArrayList::new));
System.out.println(als);
String ch = (String) sca.stream().filter(s -> s.getStr().equals("1")).map(ac -> ac.getCheck());
System.out.println(ch);
}
}
執行代碼時出現以下錯誤:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot cast from Stream<String> to String
at GetTheArrayListStoredInAnotherArrayList.main(GetTheArrayListStoredInAnotherArrayList.java:24)
不能完全確定您要做什么,但是您需要稍微更改代碼:
List<String> als = sca.stream()
.filter(s -> s.getStr().equals("2"))
.flatMap(sc -> sc.getAl().stream())
.collect(Collectors.toList());
一些東西 :
flatMap
必須返回Stream
(在您的情況下,您將返回List
)
Collectors.toList
不保證返回的List
,因此分配是給List
而不是ArrayList
。
編輯
這個:
Stream<String> stream = sca.stream().filter(s -> s.getStr().equals("1"))
.map(ac -> ac.getCheck());
將產生一個Stream<String>
。 您不能簡單地將其轉換為String
,而必須將其收集/減少為所需的任何內容。 就像說一個List
:
List<String> list = sca.stream()
.filter(s -> s.getStr().equals("1"))
.map(ac -> ac.getCheck())
.collect(Collectors.toList());
或單個String
,例如:
String r = sca.stream()
.filter(s -> s.getStr().equals("1"))
.map(ac -> ac.getCheck())
.collect(Collectors.joining(","));
這實際上是基本內容...您應該真正學習一些示例和文檔。
更改
ArrayList<String> als = sca.stream().filter( s -> s.getStr().equals("2")).flatMap( sc -> sc.getAl());
至
ArrayList<String> als = sca.get(0).getAl();
首先,您必須使用List而不是ArrayList。 因此,使用列表,您的代碼將看起來像
List<String> als1 = null;
List<String> als = sca.stream().
filter(s -> s.getStr().equals("2")). //Comparing
map(s -> s.getAl()) // Converting List<SampleClass> to list of all al list inside all SampleClass in format List<List<Straing>>
.flatMap(ArrayList::stream) //Creating a flat list from list of list of List :: List<List<Straing>> --To--> List<String>
.collect(Collectors.toList()); // Collecting as list
我已詳細注釋了此代碼。 但是這里,如果列表中有兩個SampleCalss對象,其str = 2,則它將合並兩個對象的al列表。 希望對您有幫助。
我正在嘗試將ArrayList存儲在對象的ArrayList中。
好吧,基本算法如下:對sca
過濾,以便僅保留str
為“ 2”的元素->從所有剩余元素中獲取單個元素->獲取存儲在該元素內部的al
。
您已經正確完成了第一部分:
sca.stream().filter( s -> s.getStr().equals("2"))
但是現在您需要從過濾后的結果中獲取單個元素(過濾器可能導致剩余多個元素),因此您可以調用findFirst
:
.findFirst().get()
如果過濾器后沒有剩余元素,則此get
調用將引發異常。 如果您不希望它引發異常,則可以將其替換為orElse
調用:
.findFirst.orElse(new SampleClass("", null))
如果使用orElse
,則如果沒有str
為“ 2”的元素,則方法鏈的評估結果將為null
。
現在,您只需要通過調用getAl()
獲取數組列表:
.getAl();
現在,我們將所有這些結合在一起:
ArrayList<String> als = sca.stream()
.filter( s -> s.getStr().equals("2"))
.findFirst().orElse(new SampleClass("", null)).getAl();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.