我有一个ArrayList<WebElements>
,它的元素都有一些文本片段。我想存储那些WebElements
的索引,它们在新的ArrayList<Integer>
中包含唯一的文本块。例如,如果文本是(a,b,c,a,b,d),那么我需要(1,2,3,6)。
我试着用一个stream
将文本获取到ArrayList<String> piecesOfText
,用另一个ArrayList<String> piecesOfTextUnique
挑选唯一的文本,然后循环通过piecesOfTextUnique
并通过indexOf()
获得piecesOfText
中那些文本的索引
ArrayList<WebElement> webElementsWithText=getWebElements();
ArrayList<String> piecesOfText= new ArrayList<>();
webElementsWithText.stream()
.map(WebElement::getText)
.forEach(piecesOfText::add);
ArrayList<String> piecesOfTextUnique = (ArrayList<String>) piecesOfText.stream()
.distinct()
.collect(Collectors.toList());
ArrayList<Integer> uniqueIndeces=new ArrayList<>();
for (int i=0;i< piecesOfTextUnique.size();i++) {
uniqueIndeces.add(piecesOfText.indexOf(piecesOfTextUnique.get(i)));
}
这个可以,但是有人能建议一个更简洁/优雅的解决方案吗?
- 您可以在
forEach
中使用collect
方法代替Collection#add
-ing。 - 你不能假设
Collectors.toList
返回java.util.ArrayList
。可能导致ClassCastException
. piecesOfTextUnique
在语义上等同于piecesOfText.distinct()
,因此piecesOfText
可以内联。- Last for循环可以替换为
IntStream
。
所以,最终的结果是:
ArrayList<WebElement> webElementsWithText = getWebElements();
List<String> piecesOfTextUnique = webElementsWithText.stream()
.map(WebElement::getText)
.distinct()
.collect(Collectors.toList());
ArrayList<Integer> uniqueIndeces = IntStream.range(0, piecesOfTextUnique.size())
.mapToObj(i -> piecesOfTextUnique.get(i))
.map(s -> piecesOfText.indexOf(s))
.collect(Collectors.toCollection(ArrayList::new));