For the following code, I get an average computation time of 50 ms. How can I optimize
filter(u -> myStrings.contains(u.getName())
to get faster computation time?
list size 3000000, averaged 100 times
LongSummaryStatistics{count=100, sum=5135, min=46, average=51,350000, max=147}
Remark: the class User2 contains other attributes, too (plus getters, setters).
code:
public class Temp2 {
static HashSet<String> myStrings = new HashSet<>();
static long test1(List<User2> user2s) {
long time1 = System.currentTimeMillis();
ArrayList<User2> collect = user2s.stream()
.filter(u -> myStrings.contains(u.getName()))
.collect(Collectors.toCollection(ArrayList::new));
long time2 = System.currentTimeMillis();
return time2 - time1;
}
static class User2 {
String name;
public User2(String name) {this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
public static void main(String... args) {
for (int i = 0; i < 15; i++) {myStrings.add(getRandomString());}
int size = 3_000_000;
List<User2> user2s = new ArrayList<>();
for (int i = 0; i < size; i++) {
user2s.add(new User2(getRandomString()));
}
repeat("test:", user2s, Temp2::test1, 100);
}
private static void repeat(String name, List<User2> user2s, ToLongFunction<List<User2>> test, int iterations) {
System.out.println("list size " + user2s.size() + ", averaged " + iterations + " times");
System.out.println(
IntStream.range(0, iterations)
.mapToLong(i -> test.applyAsLong(user2s))
.summaryStatistics());
}
private static String getRandomString() {
SecureRandom random = new SecureRandom();
return (new BigInteger(130, random).toString(32)).substring(0,12);
}
}