Lambda 创建自定义比较器,以防变量关闭 private可选getTopExample(列表exampleList,字符串输入){ String lowerCaseInput=input.toLowerCase(); 比较器exampleNearestMatchComparator=exampleComparator .然后比较((示例ex1,示例ex2)->{ 字符串name1LowerCase=getNameOfExample(ex1).toLowerCase(); 字符串name2LowerCase=getNameOfExample(ex2).toLowerCase(); if(name1LowerCase.startsWith(输入)和name2LowerCase.startsWith(小写输入)){ 返回name1LowerCase.length()

Lambda 创建自定义比较器,以防变量关闭 private可选getTopExample(列表exampleList,字符串输入){ String lowerCaseInput=input.toLowerCase(); 比较器exampleNearestMatchComparator=exampleComparator .然后比较((示例ex1,示例ex2)->{ 字符串name1LowerCase=getNameOfExample(ex1).toLowerCase(); 字符串name2LowerCase=getNameOfExample(ex2).toLowerCase(); if(name1LowerCase.startsWith(输入)和name2LowerCase.startsWith(小写输入)){ 返回name1LowerCase.length(),lambda,java-stream,comparator,Lambda,Java Stream,Comparator,如果要防止每次重新创建最近的匹配比较器,可以在使用比较器之前进行输入,小写输入,以及更新的比较器字段: private Optional<Example> getTopExample(List<Example> exampleList, String input) { String lowerCaseInput = input.toLowerCase(); Comparator<Example> exampleNearestMatchComparator =

如果要防止每次重新创建最近的匹配比较器,可以在使用比较器之前进行
输入
小写输入
,以及更新的
比较器
字段:

private Optional<Example> getTopExample(List<Example> exampleList, String input) {
String lowerCaseInput = input.toLowerCase();
Comparator<Example> exampleNearestMatchComparator = exampleComparator
                    .thenComparing((Example ex1, Example ex2) -> {
                        String name1LowerCase = getNameOfExample(ex1).toLowerCase();
                        String name2LowerCase = getNameOfExample(ex2).toLowerCase();
                        if (name1LowerCase.startsWith(input) && name2LowerCase.startsWith(lowerCaseInput)) {
                            return name1LowerCase.length() <= name2LowerCase.length() ? 1 : -1;
                        } else if (name1LowerCase.startsWith(lowerCaseInput)) {
                            return 1;
                        } else if (name2LowerCase.startsWith(lowerCaseInput)) {
                            return -1;
                        } else {
                            if (name1LowerCase.contains(lowerCaseInput) && name2LowerCase.contains(lowerCaseInput)) {
                                return name1LowerCase.length() <= name2LowerCase.length() ? 1 : -1;
                            } else if (name1LowerCase.contains(lowerCaseInput)) {
                                return 1;
                            } else if (name2LowerCase.contains(lowerCaseInput)) {
                                return -1;
                            } else {
                                return 1;
                            }
                        }
                    });
            return exampleList.stream())
                    .max(exampleNearestMatchComparator);
          }

谢谢你的建议。让我看看有没有其他选择。
private Comparator<Example> exampleComparator             = // your comparator;
private String              input;
private String              lowerCaseInput;
private Comparator<Example> nearestMatchComparator        = // your lambda;
private Comparator<Example> exampleNearestMatchComparator = exampleComparator.thenComparing(nearestMatchComparator);

private Optional<Example> getTopExample(List<Example> exampleList, String input)
{
    this.input = input;
    this.lowerCaseInput = input.toLowerCase();
    return exampleList.stream().max(exampleNearestMatchComparator);
}
private Comparator<Example> exampleComparator             = // your comparator;
private Comparator<Example> nearestMatchComparator        = new NearestMatchComparator();
private Comparator<Example> exampleNearestMatchComparator = exampleComparator.thenComparing(nearestMatchComparator);

private Optional<Example> getTopExample(List<Example> exampleList, String input)
{
    nearestMatchComparator.setInput(input);
    return exampleList.stream().max(exampleNearestMatchComparator);
}

private final class NearestMatchComparator
    implements Comparator<Example>
{
    private String input;
    private String lowerCaseInput;

    public void setLowerCaseInput(String input)
    {
        this.input = input;
        this.lowerCaseInput = input.toLowerCase();
    }

    @Override
    public int compare(Example ex1, Example ex2)
    {
        // your implementation
    }
}