3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
我改變了一點(diǎn)點(diǎn)設(shè)計(jì)以使其工作,我將分發(fā)列表添加到 Logs Beans 中,因?yàn)樗哂幸粚?duì)多的關(guān)系,我能夠合并來(lái)自?xún)蓚€(gè)列表的數(shù)據(jù),但它運(yùn)行速度非常慢,因?yàn)榧洗笮》浅4?,尤其是分發(fā)列表,有人可以建議一些高性能或任何更好的設(shè)計(jì)。
List<LogsData> logsData = logs.stream()
.filter(e -> (distributionData.stream()
.filter(d ->
d.getCorrelationId.equals(e.getCorrelationId))
.filter(d-> d.getEventDate().equals(e.getEventDate()))
.map(mapper-> e.getDistribution().add(mapper); return e; })
.count())<1)
.collect(Collectors.toList());

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù)Louis Wasserman 的評(píng)論,可能可以在 Streams 有優(yōu)勢(shì)的地方使用它??紤]擁有LogsData和DistributionData(和可選的ResultBean)擴(kuò)展基類(lèi)型:
class Data {
LocalDate eventDate ;
String correlationId;
Data(LocalDate eventDate, String correlationId) {
this.eventDate = eventDate;
this.correlationId = correlationId;
}
LocalDate getEventDate() { return eventDate; }
String getCorrelationId(){ return correlationId; }
@Override
public boolean equals(Object o) {
if(!(o instanceof Data)) { return false; }
Data d = (Data) o;
return eventDate.equals(d.getEventDate())
&& correlationId.equals(d.getCorrelationId() );
}
}
列出:
List<LogsData> logsData = new ArrayList<>();
List<DistributionData> dData = new ArrayList<>();
您可以簡(jiǎn)單地將兩個(gè)列表相交
logsData.retainAll(dData);
dData.retainAll(logsData);
讓它們以相同的順序排序:
//sort so two lists have the same order. If correlationId is not unique you may need
//to enhance the comperator
Collections.sort(dData, (a, b) -> a.getCorrelationId().compareToIgnoreCase(b.getCorrelationId()));
Collections.sort(logsData, (a, b) -> a.getCorrelationId().compareToIgnoreCase(b.getCorrelationId()));
并用于Stream構(gòu)造ResultBean對(duì)象列表:
List<ResultBean> resultList = IntStream.range(0, logsData.size())
.mapToObj( i ->
new ResultBean(dData.get(i).getEventDate(), dData.get(i).getCorrelationId(),
dData.get(i).getCallingProId(), dData.get(i).getTransactionCount(),
logsData.get(i).getAuthId(), logsData.get(i).getNumberofSQL())
)
.collect(Collectors.toList());

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
一種方法是將logsData列表的元素累積到一個(gè)映射中,其中鍵logsData#getEventDate與logsData#getCorrelationId.
Map<String, LogsData> accumulator =
logsData.stream()
.collect(toMap(l -> l.getEventDate() + l.getCorrelationId(), Function.identity()));
然后流過(guò)distributionData列表并獲取地圖中的相應(yīng)元素,然后將它們轉(zhuǎn)換為ResultBean.
List<ResultBean> resultSet = distributionData.stream()
.map(d -> {
LogsData logs = accumulator.get(d.getEventDate() + d.getCorrelationId());
if (logs != null)
return new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), logs.getAuthId(), logs.getNumberofSQL());
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
這假設(shè)ResultBean有一個(gè)構(gòu)造函數(shù)接受所有必要的參數(shù),如果不是這樣,那么只需調(diào)用 setter 方法來(lái)設(shè)置必要的數(shù)據(jù)。
進(jìn)口:
import static java.util.stream.Collectors.*;
import java.util.stream.*;
import java.util.function.*;
另一種方法雖然效率較低:
List<ResultBean> resultSet = logsData.stream()
.map(l -> distributionData.stream()
.filter(d -> l.getEventDate().equals(d.getEventDate()) &&
l.getCorrelationId().equals(d.getCorrelationId()))
.findFirst()
.map(d -> new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), l.getAuthId(), l.getNumberofSQL()))
.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
略有不同,在 JDK9 中避免了這種.orElse(null)).filter(Objects::nonNull)模式:
List<ResultBean> resultSet = logsData.stream()
.flatMap(l -> distributionData.stream()
.filter(d -> l.getEventDate().equals(d.getEventDate()) &&
l.getCorrelationId().equals(d.getCorrelationId()))
.findFirst()
.map(d -> new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), l.getAuthId(), l.getNumberofSQL()))
.stream()
)
.collect(Collectors.toList());
添加回答
舉報(bào)