Я вижу два способа сделать его универсальным. Первый - использовать отражение, чтобы обнаружить метод для вызова из строкового представления поля. Второй - создать универсальный метод get, который принимает аргумент String и возвращает значение соответствующего поля. Второй безопаснее, поэтому я сосредоточусь на этом. Я начну с ответа @Anant Goswami, который уже сделал большую часть работы.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
class Scratch {
// Input class from Anant Goswami in previous reply
static class Input {
private String nation, company, industry;
private int employees;
public Input(String nation, String company, String industry, int employees) {
super();
this.nation = nation;
this.company = company;
this.industry = industry;
this.employees = employees;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getIndustry() {
return industry;
}
public void setIndustry(String industry) {
this.industry = industry;
}
public int getEmployees() {
return employees;
}
public void setEmployees(int employees) {
this.employees = employees;
}
@Override
public String toString() {
return String.format(
"Nation : %s, Company : %s, Industry : %s, Employees : %s",
nation, company, industry, employees);
}
public Object get(String field){
switch (field.toLowerCase()){
case "nation": return getNation();
case "company": return getCompany();
case "industry": return getIndustry();
case "employees": return getEmployees();
default: throw new UnsupportedOperationException();
}
}
}
private static Map<String, List<Input>> group(List<Input> inputs, String... fields){
Function<Input, String> groupBy = i -> Arrays.stream(fields).map(f -> i.get(f).toString()).collect(Collectors.joining("-"));
Map<String, List<Input>> result = inputs.stream().collect(Collectors.groupingBy(groupBy));
System.out.println(result);
return result;
}
public static void main(String[] args) {
List<Input> input = Arrays.asList(new Input("India", "A", "IT", 12),
new Input("USA", "B", "ELECTRICAL", 90), new Input("India",
"B", "MECHANICAL", 122), new Input("India", "B", "IT",
12), new Input("India", "C", "IT", 200));
group(input, "company");
group(input, "nation", "Company");
}
}
которые дают в качестве вывода
{A=[Nation : India, Company : A, Industry : IT, Employees : 12], B=[Nation : USA, Company : B, Industry : ELECTRICAL, Employees : 90, Nation : India, Company : B, Industry : MECHANICAL, Employees : 122, Nation : India, Company : B, Industry : IT, Employees : 12], C=[Nation : India, Company : C, Industry : IT, Employees : 200]}
{India-B=[Nation : India, Company : B, Industry : MECHANICAL, Employees : 122, Nation : India, Company : B, Industry : IT, Employees : 12], India-C=[Nation : India, Company : C, Industry : IT, Employees : 200], India-A=[Nation : India, Company : A, Industry : IT, Employees : 12], USA-B=[Nation : USA, Company : B, Industry : ELECTRICAL, Employees : 90]}