我正在嘗試使用流替換該代碼。
public int countPenaltyPointsTest(Set<OffenceEntity> offences, LocalDate date) {
int sum = 0;
for (OffenceEntity offence : offences) {
for (OffenceDetailsEntity offenceDetailsEntity : offence.getDetails()) {
if (date.isAfter(offenceDetailsEntity.getStartDate())
&& date.isBefore(offenceDetailsEntity.getEndDate())) {
sum =offenceDetailsEntity.getPenaltyPoints();
}
}
}
我與 OffenceDetailsEntity 有 OneToMany 關系的 OffenceEntity:
@Entity
public class OffenceEntity {
...
private Set<OffenceDetailsEntity> details;
}
@Entity
public class OffenceDetailsEntity {
...
private int penaltyPoints;
private LocalDate startDate;
private LocalDate endDate;
@ManyToOne
@JoinColumn(referencedColumnName = "id")
private OffenceEntity offence;
}
我想收集兩個日期之間的罰分。例如,當我在 OffenceEntity 中有諸如罰分之類的欄位時,我知道該怎么做。例子:
int sum = offences.stream()
.mapToInt(OffenceEntity::getPenaltyPoints)
.sum();
但我不知道如何“跳轉”到 OffenceEntity 中的集合
uj5u.com熱心網友回復:
由于您需要展平流資料,即將型別的每個元素OffenceEntity轉換為一組元素,mapToInt()這不是正確的操作。為此,您可以使用flatMap()(或其風味flatMapToInt())。
要區分兩個操作map()和flatMap(),請記住一個簡單的原則:
- 當您需要一對一的轉換時,使用
map()或它的味道 - 對于一對多的轉換-
flatMap()或者它的味道。
從 Java 16 開始,我們還可以利用mapMulty()它來展平流中的資料。但它是一種特殊用途的工具,而不是一種常見的選擇。除了展平之外,此操作還允許過濾掉流元素,因此與flatMap()將元素變成1 (一個或多個)元素相比,mapMulty()產生0 (零個或多個)元素。
平面圖()
flatMap()期望作為引數的函式,該函式接受一個元素并產生一個流(這也是and之間的重要區別 )。map flatMap
扁平化流資料后,我們需要過濾OffenceDetailsEntity具有合適日期的物件并提取penaltyPoints. 這可以使用filter() 來完成mapToInt()。
public int countPenaltyPointsTest(Set<OffenceEntity> offences, LocalDate date) {
return offences.stream() // Stream<OffenceEntity>
.flatMap(offence -> offence.getDetails().stream()) // Stream<OffenceDetailsEntity>
.filter(ode -> date.isAfter(ode.getStartDate()) // Stream<OffenceDetailsEntity>
&& date.isBefore(ode.getEndDate()))
.mapToInt(OffenceDetailsEntity::getPenaltyPoints) // IntStream
.sum();
}
多圖()
此操作允許將命令式編程功能(即回圈和條件陳述句)合并到流管道中。
如前所述,它是一種特殊用途的工具,具有許多特性,應謹慎應用。
以下是API Note中關于何時使用的參考mapMulty():
flatMap在以下情況下,此方法更可取:
- 當用少量(可能為零)的元素替換每個流元素時。
Stream使用這種方法可以避免為每組結果元素創建一個新實體的開銷,如flatMap.- 當使用命令式方法生成結果元素比以
Stream.
例如,mapMulty()能夠替換組合flatMap() filter()或多個flatMap()操作。
它需要一個型別的引數BiConsumer,即消費者,而消費者又接受兩個引數:流元素和結果型別的消費者。提供給消費者的每個值都成為一個新的流元素,替換初始元素。
以下是如何使用以下方法實作此方法mapMultyToInt():
public int countPenaltyPointsTest(Set<OffenceEntity> offences, LocalDate date) {
return offences.stream()
.mapMultiToInt((offence, consumer) ->
offence.getDetails().forEach(ode -> {
if (date.isAfter(ode.getStartDate()) && date.isBefore(ode.getEndDate()))
consumer.accept(ode.getPenaltyPoints());
}))
.sum();
}
有關如何使用的更多示例和資訊mapMulty(),請查看此問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/504634.html
上一篇:在python中使用.index(“”)作為嵌套串列
下一篇:計算R中許多資料幀的sd和均值
