In Java 8, can I use streams to manipulate, filter and compare string? I know how to do in java 5 but stuck with Java 8 api using Streams. Please assist with Java 8
Let us assume I have two Java objects (Request and Response) as below
public class Request {
List<String> requestIds;
requestIds = new ArralyList();
requestIds.add("xyz:one/first/same");
requestIds.add("zzz:five/match/same");
requestIds.add("xyz:different/second/different");
}
public class Response {
List<Item> responseIds;
responseIds = new ArralyList();
Item one = new Item("xyz:ten/first/same");
Item two = new Item("zzz:three/match/same");
Item three = new Item("xyz:one/third/second");
responseIds.add(one);
responseIds.add(two);
responseIds.add(three);
}
public class Item {
String id;
}
I need to compare the request and response list objects as below
From request List I need extract indexOf first “/” for each list entry (for example “/first/same”) and compare this string with Response list to see which contains or not. If contains add it to result list.
Java 5 Impl:
List result = new ArrayList();
for(String requestString:requestIds){
String extractedRequestString = requestString.subString(requestString.indexOf("/"));
for(int i=0;i<responseIds.length;i++) {
String responseString = responseIds.get(i).getId();
if (responseString.equals(extractedRequestString)) {
// If condition true, Adding request I'd value to result ArrayList
result.add(requestString);
}
}
}
Java 8: I am trying like,
List resultList = reponseIds.parallelStream.filter()
Expected result:
Result - ["xyz:one/first/same"
"zzz:five/match/same"]
Advertisement
Answer
Your code looks broken to me. Based on your “Java 5 Impl” logic I will assume responseIds
should be:…
Update: According to your comment both the request and response need to id.substring(id.indexOf("/"));
Given that assumption you could do:
// Transforming ids here to avoid doing it for each element in requestIds
List<String> stringResponseIds = responseIds.stream()
.map(item -> item.id.substring(item.id.indexOf("/")))
.collect(Collectors.toList());
List<String> result = requestIds.stream().filter(id -> {
// extracting here instead of using `map` to avoid loosing the complete string
String extractedRequestString = id.substring(id.indexOf("/"));
// A simple contains now that responses are Strings.
return stringResponseIds.contains(extractedRequestString);
}).collect(Collectors.toList());
Runnable example: https://replit.com/@lrn2prgrm/StreamStringMatching#Main.java