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