Compadre77
Compadre77

Reputation: 21

How obtain a Set of Strings from a Map of objects with a string property

I need to get a Set<String> with the accountNumbers from the given Map<String, Account> and filter the map contents by retaining only active accounts (active == true) so that there will be no inactive accounts.

Account class has the following attributes:

private String number;
private String owner;
private double balance;
private boolean active = true;

My solution so far looks like this:

public Set<String> getAccountNumbers() {
    return new HashSet<String>(accounts.values().stream().filter(Account::isActive));
}

I tried casting, but that didn't seem to work. Can somebody tell me, how I access the attribute number from here on?

Upvotes: 0

Views: 214

Answers (1)

Alexander Ivanchenko
Alexander Ivanchenko

Reputation: 28988

You have to apply map in order to transform the stream of accounts Stream<Account> into a stream of strings Stream<String>. And then apply the terminal operation collect to obtain a Set as a result of the execution of stream pipeline.

Your attempt to pass the stream to the constructor of the HashSet is incorrect (it expects a Collection, not a Stream) and unnecessary.

Note: stream without a terminal operation (like collect, count, forEach, etc.) will never get executed. map and filter are called intermediate operations.

public Set<String> getAccountNumbers() {
    return accounts.values().stream()    // Stream<Account>
            .filter(Account::isActive)
            .map(Account::getNumber)     // Stream<String>
            .collect(Collectors.toSet());
}

For more information on streams take a look at this tutorial

Upvotes: 2

Related Questions