java - 传递流顺序的方法引用
问题描述
我有一个处理器类,它接受要在流上运行的任意谓词,以及一个用于排序的字段。我的处理器类:
import com.example.vm.domain.Transaction;
import lombok.Builder;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Builder
public class Processor {
private Collection<Predicate<Transaction>> predicates;
public List<Transaction> process(List<Transaction> transactions) {
return process(transactions, TransactionFields.CATEGORY.getExtractor());
}
public List<Transaction> process(List<Transaction> transactions, Function<Transaction, Object> order) {
if (predicates == null) {
return transactions;
}
if (order == null) {
return transactions.stream()
.parallel()
.filter(predicates.stream().reduce(p -> true, Predicate::and))
.collect(Collectors.toList());
} else {
return transactions.stream()
.parallel()
.filter(predicates.stream().reduce(p -> true, Predicate::and))
.sorted(Comparator.comparing(Transaction::getCategory))
.collect(Collectors.toList());
}
}
}
这工作正常,但我希望Comparator.comparing(Transaction::getCategory)
成为一个参数,以便
.sorted(Comparator.comparing(Transaction::getCategory))
变成这个
.sorted(Comparator.comparing(order))
重载调用:
process(transactions, TransactionFields.CATEGORY.getExtractor());
来自枚举以返回提取器字段:
import com.example.vm.domain.Transaction;
import java.util.function.Function;
public enum TransactionFields {
CATEGORY("category", t -> t.getCategory());
private String name;
private Function<Transaction, Object> extractor;
private TransactionFields(String name, Function<Transaction, Object> extractor) {
this.name = name;
this.extractor = extractor;
}
public Function<Transaction, Object> getExtractor() {
return extractor;
}
}
我无法让它工作,并且投射到 Comparator 也失败了。解决方案不必是比较器,只要它排序即可。有谁知道如何解决这个问题?
解决方案
Function
的参数的通用约束Comparator#comparing
是<T,U extends Comparable<? super U>>
,这意味着函数必须返回扩展的东西Comparable<…>
。将您的功能从更改Function<Transaction, Object>
为Function<Transaction, Comparable<…>>
,您应该能够做到.sorted(Comparator.comparing(order))
。
唯一的要求是您的Transaction#getCategory
方法返回的内容是Comparable
(字符串、数字、实现的自定义类型Comparable<YourType>
)。
推荐阅读
- openimageio - OpenImageIO:以显示窗口分辨率而不是数据分辨率打开图像
- python - 缩放pygame屏幕截图
- node.js - 来自另一个 js 文件的函数不执行任何操作
- java - Java 无法解析为类型
- amazon-web-services - 使用 Cognito 用户池限制/限制 API 网关端点上用户的最佳方法?
- macos - 如何在重新启动时运行“dtrace”并保持运行以监控 MacOS 上的文件
- powershell - 为 CSV 文件添加标题
- javascript - 如何在同一个 DOM 控制台中访问嵌套的文档对象?
- node.js - 删除推文中的 URL 卡片 (API)
- java - 只有一些 URL 没有在 Webview 中加载