Stream complex examples like Queries
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
class Client {
private final String name;
private final String country;
public Client(String n, String c) {
this.name = n;
this.country = c;
}
public String getName() {
return this.name;
}
public String getCountry() {
return this.country;
}
public String toString() {
return "Client:" + this.name + " in " + this.country;
}
}
class Balance {
private final Client client;
private final int year;
private final int amount;
public Balance(Client client, int year, int amount) {
this.client = client;
this.year = year;
this.amount = amount;
}
public Client getClient() {
return this.client;
}
public int getYear() {
return this.year;
}
public int getAmount() {
return this.amount;
}
public String toString() {
return "{" + this.client + ", " + "year: " + this.year + ", " + "amount:" + this.amount + "}";
}
}
public class StreamExercise {
public static void main(String[] args) {
Client raj = new Client("Raj", "India");
Client rose = new Client("Rose","USA");
Client rock = new Client("Rock","USA");
Client jack = new Client("Jack","USA");
Client peter = new Client("Peter","UK");
List<Balance> balances = Arrays.asList(
new Balance(peter, 2011, 400),
new Balance(raj, 2012, 4000),
new Balance(rose, 2011, 810),
new Balance(rock, 2013, 900),
new Balance(jack, 2014, 1050)
);
// FIND ALL BALANCE OF 2011 AND SORT IN ASCENDING ORDER
List<Balance> balacesOf2011 =
balances
.stream()
.filter(bal->bal.getYear()==2011)
.sorted(Comparator.comparing(Balance::getAmount))
.collect(Collectors.toList());
System.out.println("BALANCE OF 2011 SORT IN ASCENDING ORDER");
System.out.println("balacesOf2011: "+balacesOf2011);
// UNIQUE COUNTRIES WHERE THE CLIENT STAYS
List<String> uniqueCities =
balances
.stream()
.map(bal->bal.getClient().getCountry())
.distinct()
.collect(Collectors.toList());
System.out.println("\n\nUNIQUE CITIES WHERE THE CLIENTS STAYS");
System.out.println("uniqueCities: "+uniqueCities);
// FIND ALL CLIENTS FROM USA AND SORT THEM BY NAME
List<Client> cliecntFromUsa =
balances
.stream()
.map(bal->bal.getClient())
.filter(client->client.getCountry().equals("USA"))
.sorted(Comparator.comparing(Client::getName))
.collect(Collectors.toList());
System.out.println("\n\nALL CLIENTS FROM USA AND SORT THEM BY NAME");
System.out.println("cliecntFromUsa: "+cliecntFromUsa);
// FIND ALL TRADERS NAMES ONLY IN ALPHABETICAL ORDER
String names =
balances
.stream()
.map(bal->bal.getClient().getName())
.sorted()
.reduce("", (name1,name2)->name1+name2);
System.out.println("\n\nALL TRADERS NAMES ONLY IN ALPHABETICAL ORDER");
System.out.println("names: "+names);
// FIND ALL TRADERS COMMA SEPARATED NAMES ONLY IN ALPHABETICAL ORDER
String commaSeparatedNamess =
balances
.stream()
.map(bal->bal.getClient().getName())
.sorted()
.collect(Collectors.joining(", "));
System.out.println("\n\nALL TRADERS NAMES ONLY IN ALPHABETICAL ORDER");
System.out.println("commaSeparatedNamess: "+commaSeparatedNamess);
// FIND IS THERE ANY CLIENT BELONG TO CHINA ?
boolean chinaClientAvail = balances.stream()
.anyMatch(bal->bal.getClient().getCountry().equals("CHINA"));
System.out.println("\n\nANY CLIENT AVAILABLE FROM CHINA: "+chinaClientAvail);
// FIND HIGHEST AMOUNT CLIENT
System.out.println("\n\nCLIENT WITH HIGHEST BALANCE");
balances
.stream()
.reduce((b1,b2)->b1.getAmount()>b2.getAmount()?b1:b2)
.ifPresent(bal->System.out.println("Highest Amount Client: "+bal.getClient()));
// FIND TOTAL OF ALL AMOUNTS OF ALL CLIENTS
int totalAmount =
balances
.stream()
.mapToInt(Balance::getAmount) //bal->bal.getAmount()
.sum();
System.out.println("\n\nTOTAL AMOUNT OF ALL CLIENTS: "+totalAmount);
/*
mapToInt method fetch all the amounts from each client (represented as an Integer)
and returns an IntStream as the result (instead of a Stream<Integer>).
You can then call the sum method available in the IntStream interface to calculate the sum of amounts!
*/
}
}
Output:
BALANCE OF 2011 SORT IN ASCENDING ORDER
balacesOf2011: [{Client:Peter in UK, year: 2011, amount:400}, {Client:Rose in USA, year: 2011, amount:810}]
UNIQUE CITIES WHERE THE CLIENTS STAYS
uniqueCities: [UK, India, USA]
ALL CLIENTS FROM USA AND SORT THEM BY NAME
cliecntFromUsa: [Client:Jack in USA, Client:Rock in USA, Client:Rose in USA]
ALL TRADERS NAMES ONLY IN ALPHABETICAL ORDER
names: JackPeterRajRockRose
ALL TRADERS NAMES ONLY IN ALPHABETICAL ORDER
commaSeparatedNamess: Jack, Peter, Raj, Rock, Rose
ANY CLIENT AVAILABLE FROM CHINA: false
CLIENT WITH HIGHEST BALANCE
Highest Amount Client: Client:Raj in India
TOTAL AMOUNT OF ALL CLIENTS: 7160