多个谓词将集合分组到 hashmap
Multiple Predicates to group collection to hashmap
我有一个对象列表如下 -
List<Transaction>
交易对象的样子
Transaction {
String Status;
}
Status <A,B,C,D,E,F,G...>
If Status in (A,B,C)->Success
If Status in (D,E,F)->Failure
If Status in (G,H...)->Pending
定义了用于识别每个状态交易的单独谓词。
预期输出将是一个哈希图,其中 Success/Failure/Rejected 文本作为键,这些状态的总计数作为值
HashMap<String, Integer> ->
{
"Success": 1,
"Failure":2,
"Pending":2
}
我无法在一次执行中继续执行此操作。现在,我分别得到计数。任何人都可以协助请求吗?
您可以先像这样声明一个枚举来表示您感兴趣的 3 个状态。
public enum TxStatus {
Success, Failure, Pending;
}
然后在Transaction
中写一个方法,将String
字面值转换成你期望的真实状态值。这是一个这样的实现。
public class Transaction {
private final String status;
private Pattern SUCCESS_PATTERN = Pattern.compile("[ABC]");
private Pattern FAILURE_PATTERN = Pattern.compile("[DEF]");
private Pattern PENDING_PATTERN = Pattern.compile("[GHI]");
public Transaction(String status) {
super();
this.status = status;
}
public String getStatus() {
return status;
}
public TxStatus interpretStatus() {
if (SUCCESS_PATTERN.matcher(status).matches()) {
return TxStatus.Success;
}
if (FAILURE_PATTERN.matcher(status).matches()) {
return TxStatus.Failure;
}
if (PENDING_PATTERN.matcher(status).matches()) {
return TxStatus.Pending;
}
throw new IllegalArgumentException("Invalid status value.");
}
}
最后,您的客户端代码应如下所示,
Map<String, Long> txStatusToCountMap = txs.stream()
.collect(Collectors.groupingBy(tx -> tx.interpretStatus().toString(),
Collectors.counting()));
我有一个对象列表如下 -
List<Transaction>
交易对象的样子
Transaction {
String Status;
}
Status <A,B,C,D,E,F,G...>
If Status in (A,B,C)->Success
If Status in (D,E,F)->Failure
If Status in (G,H...)->Pending
定义了用于识别每个状态交易的单独谓词。
预期输出将是一个哈希图,其中 Success/Failure/Rejected 文本作为键,这些状态的总计数作为值
HashMap<String, Integer> ->
{
"Success": 1,
"Failure":2,
"Pending":2
}
我无法在一次执行中继续执行此操作。现在,我分别得到计数。任何人都可以协助请求吗?
您可以先像这样声明一个枚举来表示您感兴趣的 3 个状态。
public enum TxStatus {
Success, Failure, Pending;
}
然后在Transaction
中写一个方法,将String
字面值转换成你期望的真实状态值。这是一个这样的实现。
public class Transaction {
private final String status;
private Pattern SUCCESS_PATTERN = Pattern.compile("[ABC]");
private Pattern FAILURE_PATTERN = Pattern.compile("[DEF]");
private Pattern PENDING_PATTERN = Pattern.compile("[GHI]");
public Transaction(String status) {
super();
this.status = status;
}
public String getStatus() {
return status;
}
public TxStatus interpretStatus() {
if (SUCCESS_PATTERN.matcher(status).matches()) {
return TxStatus.Success;
}
if (FAILURE_PATTERN.matcher(status).matches()) {
return TxStatus.Failure;
}
if (PENDING_PATTERN.matcher(status).matches()) {
return TxStatus.Pending;
}
throw new IllegalArgumentException("Invalid status value.");
}
}
最后,您的客户端代码应如下所示,
Map<String, Long> txStatusToCountMap = txs.stream()
.collect(Collectors.groupingBy(tx -> tx.interpretStatus().toString(),
Collectors.counting()));