【问题标题】:Java 8 streams map, keep nulls as nullJava 8 流映射,保持空值为空
【发布时间】:2016-07-23 21:35:12
【问题描述】:

我有这段代码:

public LatLng[] locationDtoListToLatLngArray(List<LocationDto> locationDtoList) {
    return locationDtoList.stream()
            .map(locationDto -> new LatLng(locationDto.getLatitude(), locationDto.getLongitude()))
            .toArray(LatLng[]::new);
}

但如果locationDto.map 内是null,则会崩溃

我修复了它:

public LatLng[] locationDtoListToLatLngArray(List<LocationDto> locationDtoList) {
    return locationDtoList.stream()
            .map(locationDto -> locationDto == null ? null : new LatLng(locationDto.getLatitude(), locationDto.getLongitude()))
            .toArray(LatLng[]::new);
}

但我想知道是否有更好的方法(不检查是否locationDto == null

请注意,如果locationDto == null,我想保留null,所以过滤器不是一个选项:)

谢谢

编辑:我知道问题在于访问一个空对象,我只想知道是否有像 .map() 这样的函数,可以满足我的需要,.mapKeepingNulls(),类似的东西。

编辑 2:我最终这样做了:

public LatLng[] locationDtoListToLatLngArray(List<LocationDto> locationDtoList) {
    return locationDtoList.stream()
            .map(this::locationDtoToLatLng)
            .toArray(LatLng[]::new);
}

private LatLng locationDtoToLatLng(LocationDto locationDto) {
    if (locationDto == null) {
        return null;
    }
    return new LatLng(locationDto.getLatitude(), locationDto.getLongitude());
}

【问题讨论】:

  • 比检查null更好的方法?
  • 附带的问题是:为什么nulls 在列表的首位? (而且我认为没有更清洁的方法,除了将所有这些都包装在 Optional 中,这将适得其反 IMO)。
  • @SotiriosDelimanolis,是的,我认为这可能是一些功能,可以做我想做的事.. .mapKeepingNulls() 类似这样.. 我是新的流

标签: java lambda java-stream


【解决方案1】:

问题是您正在访问可能具有null 值的方法。如果您真的不希望在那里进行空值检查(我认为这是一个很好的解决方案),您可以尝试在LatLng 中创建一个静态方法,该方法将采用LocationDto 并返回正确的实例或null(当提供时) LocationDtonull

类似这样的:

public static LatLng getFromLocationDto(LocationDto ldt){
    if(ldt == null)
        return null;

    return new LatLng(ldt.getLatitude(), ldt.getLongitude());
}

null 检查必须在某处(除非您可以确保在locationDtoList 中不会有null)。

【讨论】:

    【解决方案2】:

    这个问题与 Java 8 流无关。在执行locationDto.getLatitude() 时,您将获得NullPointerException

    检查空值是完全正常的。如果你不在溪流中,我几乎可以肯定你不会打扰到你。

    也许您不喜欢的是您在单行中执行内联条件操作,在这种情况下,我建议您使用像 _createLatLng(LocationDto locationDto) 这样的辅助函数来外部化该过程。

    【讨论】:

      【解决方案3】:

      您可以使用 Optional,这是 Java 8 中为此目的而设计的一个新类。

      //将locationDtoList转换为Optional列表

      locationDtoList.stream()
              .filter(Optional::isPresent)
              .map(Optional::get)
              .map(locationDto -> new LatLng(locationDto.getLatitude(),      locationDto.getLongitude()))
              .toArray(LatLng[]::new);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 1970-01-01
        • 2017-12-04
        • 2015-02-11
        相关资源
        最近更新 更多