【发布时间】:2019-10-03 02:06:37
【问题描述】:
我有以下代码,它根据我从 REST API 获得的传入国家/地区详细信息获取所有域列表
private static List<Domain> testDataInPlain() {
List<Domain> allDomains = new ArrayList<>();
List<Country> countries = buildIncomingCountries();
List<Country> availableCountries = availableCountries();
for (Country availableCountry : availableCountries) {
if(countries.contains(availableCountry)) {
List<Domain> availableDomains = getBusinessCountryDomains(availableCountry);
if(availableDomains == null) {
return new ArrayList<>();
} else {
for (Domain availableDomain : availableDomains) {
if(availableCountry.getName().equals(availableDomain.getCountry())) {
allDomains.add(availableDomain);
}
}
}
}
}
return allDomains;
}
我正在尝试将上述代码转换为 Java8 Lambda 函数,到目前为止我已转换的代码如下所示,但它不正确
private static List<?> testDataInLambda() {
List<Domain> allDomains = new ArrayList<>();
List<Country> countries = buildIncomingCountries();
List<Country> availableCountries = availableCountries();
return availableCountries.stream()
.filter(countries::contains)
.map(country -> {
List<Domain> availableDomains = getBusinessCountryDomains(country);
return availableDomains;
})
.filter(allDomains::contains)
.collect(Collectors.toList());
}
我无法为 Lambda 带来完整的转换,因为我特别想为
引入 lambda 函数if(availableCountry.getName().equals(availableDomain.getCountry()))
谁能帮我解决这个问题?
我的完整源代码如下所示
package com.example.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
System.out.println(testDataInPlain());
System.out.println(testDataInLambda());
}
private static List<Domain> testDataInPlain() {
List<Domain> allDomains = new ArrayList<>();
List<Country> countries = buildIncomingCountries();
List<Country> availableCountries = availableCountries();
for (Country availableCountry : availableCountries) {
if(countries.contains(availableCountry)) {
List<Domain> availableDomains = getBusinessCountryDomains(availableCountry);
if(availableDomains == null) {
return new ArrayList<>();
} else {
for (Domain availableDomain : availableDomains) {
if(availableCountry.getName().equals(availableDomain.getCountry())) {
allDomains.add(availableDomain);
}
}
}
}
}
return allDomains;
}
private static List<?> testDataInLambda() {
List<Domain> allDomains = new ArrayList<>();
List<Country> countries = buildIncomingCountries();
List<Country> availableCountries = availableCountries();
return availableCountries.stream()
.filter(countries::contains)
.map(country -> {
List<Domain> availableDomains = getBusinessCountryDomains(country);
return availableDomains;
})
.filter(allDomains::contains)
.collect(Collectors.toList());
}
private static List<Country> buildIncomingCountries() {
// I am mocking the below details
List<Country> countries = new ArrayList<>();
countries.add(new Country("IND",1));
countries.add(new Country("USA",2));
countries.add(new Country("GER",3));
return countries;
}
private static List<Country> availableCountries() {
// I am mocking the below details
List<Country> countries = new ArrayList<>();
countries.add(new Country("IND",1));
countries.add(new Country("KEN",2));
countries.add(new Country("GER",3));
countries.add(new Country("FRA",4));
countries.add(new Country("JPN",5));
countries.add(new Country("CHN",6));
countries.add(new Country("UAE",7));
countries.add(new Country("IRE",8));
return countries;
}
private static List<Domain> getBusinessCountryDomains(Country country) {
// I am mocking the below details based on the country
List<Domain> domains = new ArrayList<>();
domains.add(new Domain(".in","IND"));
domains.add(new Domain(".zim","ZIM"));
domains.add(new Domain(".den","DEN"));
domains.add(new Domain(".fra","FRA"));
return domains;
}
}
@Data
@AllArgsConstructor
class Country {
private String name;
private Integer code;
}
@Data
@AllArgsConstructor
class Domain {
private String name;
private String country;
}
【问题讨论】:
标签: java arraylist lambda java-8 java-stream