相关疑难解决方法(0)

null-safe mapping使用默认实现的Comparator

是否有内置的可能性在Java 8中创建一个空安全的映射比较器而无需编写自己的实现Comparator

运行以下代码时,它会导致NPE,因为keyExtractor参数Comparator.comparing()可能返回一个null值:

public class ToSort
{

    private String sortBy;

    public ToSort(String sortBy)
    {
        this.sortBy = sortBy;
    }

    public String getSortBy()
    {
        return sortBy;
    }

    public static void main(String[] args)
    {
        // mapping comparator
        Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);                          
        SortedSet<ToSort> set = new TreeSet<>(comp);
        ToSort o1 = new ToSort("1");
        ToSort o2 = new ToSort(null);

        set.add(o1);

        System.out.println(set.contains(o2)); //NPE because o2.getSortBy() == null

    }
}
Run Code Online (Sandbox Code Playgroud)

java.util.Comparator.lambda中线程"main"java.lang.NullPointerException中的异常$比较java.util.Comparator上的$ 77a9974f $ 1(Comparator.java:469)$$ Lambda $ 2/1480010240.compare(未知来源)at java.util.Comparators $ NullComparator.compare(Comparators.java:83),java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376),位于java.util的java.util.TreeMap.getEntry(TreeMap.java:345) …

java comparator java-8

62
推荐指数
1
解决办法
1万
查看次数

具有空值的比较器

我们有一些代码,它们根据坐标之间的距离对地址列表进行排序.这是通过collections.sort与自定义比较器完成的.

但是,有时会在列表中出现没有坐标的地址,从而导致出现NullPointerException.我最初的想法是让比较器返回0作为地址的距离,其中至少有一个坐标为空.我担心这可能会导致列表中"有效"元素的订单损坏.

所以在比较器ok中返回空数据的'0'值,或者有更清晰的方法来解决这个问题.

java comparator

55
推荐指数
5
解决办法
5万
查看次数

用于在Java 8 Stream中进行排序的空安全日期比较器

我用这个来获得最新的项目.我怎样才能使这个为null安全并且最后(最旧)的空日期排序.createDt是一个joda LocalDate对象.

Optional<Item> latestItem = items.stream()
                             .sorted((e1, e2) -> e2.getCreateDt().compareTo(e1.getCreateDt()))
                             .findFirst();
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

31
推荐指数
2
解决办法
4万
查看次数

Java 8 Comparator nullsFirst naturalOrder困惑

这可能是一个简单的问题,但我想清楚地理解它......

我有这样的代码:

public final class Persona
{
   private final int id;
   private final String name
   public Persona(final int id,final String name)
   {
       this.id = id;
       this.name = name;
   }
   public int getId(){return id;}    
   public String getName(){return name;}     
   @Override
   public String toString(){return "Persona{" + "id=" + id + ", name=" + name+'}';}    
 }
Run Code Online (Sandbox Code Playgroud)

我正在测试这段代码:

import static java.util.Comparator.*;
private void nullsFirstTesting()
{               
    final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
    final List<Persona>persons = Arrays.asList(new Persona(1,"Cristian"),new Persona(2,"Guadalupe"),new Persona(3,"Cristina"),new Persona(4,"Chinga"),new Persona(5,null));
    persons
            .stream()
            .sorted(comparator)
            .forEach(System.out::println);                           
}
Run Code Online (Sandbox Code Playgroud)

这显示以下结果:

Persona{id=5, …
Run Code Online (Sandbox Code Playgroud)

java sorting string comparator java-8

14
推荐指数
3
解决办法
3万
查看次数

比较器基于对象的不同可空字段

我有一个Employee包含两个字段的对象namejobTitle.对于员工对象的排序,首先应该打开jobTitle,如果jobTitle为null,则排序应该基于名称.

下面是Employee对象

public class Employee {
    private String name;
    private String jobTitle;
}
Run Code Online (Sandbox Code Playgroud)

我用链式比较与JobTitlecomparatorNameComparator实现这一目标:

public class EmployeeChainedComparator implements Comparator<Employee> {

    private List<Comparator<Employee>> listComparators;

    @SafeVarargs
    public EmployeeChainedComparator(Comparator<Employee>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(Employee emp1, Employee emp2) {
        for (Comparator<Employee> comparator : listComparators) {
            int result = comparator.compare(emp1, emp2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

public class …
Run Code Online (Sandbox Code Playgroud)

java comparator java-8

3
推荐指数
2
解决办法
911
查看次数

标签 统计

java ×5

comparator ×4

java-8 ×4

java-stream ×1

sorting ×1

string ×1