标签: optional

Optional.ofNullable() 中的空指针异常

我正在尝试将 Optional.OfNullable 方法中的集合转换为字符串,例如:

test.setAbc(Optional.ofNullable(rule.getSampleSet().toString()).orElse(null));
Run Code Online (Sandbox Code Playgroud)

但如果sampleSetnull它会给我一个NullPointerException. 谁能告诉我如何使用.map方法解决这个问题Optional

我知道一种通过事先检查可空性来做到这一点的传统方法:

if(rule.getSampeSet != null)
Run Code Online (Sandbox Code Playgroud)

但我很想知道我们是否可以在一行中完成。

java optional

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

仅当存在可选项时如何应用条件?

我有一个Optional<LocalDate>对象和一个Stream其他日期。

Stream<LocalDate> dates = ...;   
Optional<LocalDate> dateOptional = ...;
Run Code Online (Sandbox Code Playgroud)

我想过滤掉可选的所有日期。如果可选项不存在,过滤器不应该做任何事情。

我写过Predicate这样的:

Predicate<LocalDate> predicate = date -> !dateOptional.isPresent() || !date.isAfter(dateOptional.get());  
Stream<LocalDate> filteredStream = dates.filter(predicate);
Run Code Online (Sandbox Code Playgroud)

我想避免使用isPresent()get()。是否有更实用的方式来编写相同的逻辑?我正在使用 Java 8。

java predicate optional java-8 java-stream

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

删除地图条目会导致地图条目中的对象引用可选更改

当我从地图中检索地图条目时,将其存储在一个可选中,然后使用 remove(entry.getKey()) 从地图中删除相同的条目,然后Optional突然开始指向地图内可用的下一个地图条目。

让我进一步解释:

我有一堆我想排序的评论对象。评论列表应始终以被接受为答案的评论开头,它应该是列表中的第一个元素。sort 方法以映射开始,并使用 entrySet 上的流来检索acceptedAnswer布尔值设置为的第一个注释true

Map<Long, CommentDTO> sortedAndLinkedCommentDTOMap = sortCommentsAndLinkCommentRepliesWithOwningComments(commentDTOSet);
Optional<Map.Entry<Long, CommentDTO>> acceptedAnswerCommentOptional = sortedAndLinkedCommentDTOMap.entrySet().stream()
        .filter(entry -> entry.getValue().isAcceptedAsAnswer()).findFirst();
Run Code Online (Sandbox Code Playgroud)

让我们假设Map包含 3 个带有 ids 的评论3, 6, and 11。键始终是评论的 id,评论始终是值。标记为答案的评论具有 id 6。在这种情况下,将执行以下代码:

if(acceptedAnswerCommentOptional.isPresent()){
    Map.Entry<Long, CommentDTO> commentDTOEntry = acceptedAnswerCommentOptional.get();
    sortedAndLinkedCommentDTOMap.remove(commentDTOEntry.getKey());
}
Run Code Online (Sandbox Code Playgroud)

commentDTOEntry使用acceptedAnswerCommentOptional它的值初始化时,它引用了 id 为 6 的已接受答案。现在,当我从sortedAndLinkedCommentDTOMap对已接受答案的引用中删除该条目时,注释不仅sortedAndLinkedCommentDTOMapacceptedAnswerCommentOptional! 但是acceptedAnswerCommentOptional现在开始指向下一个条目,sortedAndLinkedCommentDTOMap即带有key 11.

我不明白是什么导致了这种奇怪的行为。为什么acceptedAnswerCommentOptional不简单地成为价值nullacceptedAnswerCommentOptional …

java hashmap optional java-stream

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

将 Some(List()) 变成 None

我有可选列表,例如:

val optionalEmptyList = Option(List[String]())

val optionalNonEmptyList = Option(List[String]("1","2"))

我想用 None 替换可选的空列表,同时保持可选的非空列表原样。

我想出了以下解决方案:

optionalEmptyList.flatMap(l => if (l.isEmpty) None else Option(l))

optionalNonEmptyList.flatMap(l => if (l.isEmpty) None else Option(l))

它有效,但似乎令人费解。有没有更简单的解决方案?

scala list optional

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

基于可选值调用void方法时如何使用Optional的map和orElseGet方法

我有一个我正在使用的 Java 可选变量,如下所示。

Optional<Forms> formsOptional = input.data().get().forms();
if(formsOptional.isPresent()) {
    this.doSomething(myValue, forms.get());
} else {
    this.doSomething(myValue, Forms.builder().names(myList).build());
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下, doSomething 方法是一个执行某些操作的 void 方法。由于这是一个空方法,我对如何使用 map().orElseGet() 感到困惑,因为我也没有任何要转换的东西。任何使用任何 Java8 可选技术优化这段代码的建议将不胜感激。

java if-statement optional java-8

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

Optional.ofNullable orElse 抛出 NPE

我一直在使用此代码:

Event rEvent = new Event();

Map<Long, Message> msgMap = getMsg();
Message msg = msgMap.get(rEvent.getMsgId());

Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId());
Run Code Online (Sandbox Code Playgroud)

假设rEvent.getPkId()和 msg 都是null。所以Optional.ofNullable(rEvent.getPkId())会被跳过,然后orElse被执行。这里抛出NPE. 如何使用Optional.ofNullable多个空检查重新编码?

java null optional java-8

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

从 Optional 返回集合

所以我想从数据库中的实体返回 Set 。所以我有 crudRepository,首先我通过 id 从 repo 中返回可选的 Knight,然后我想从 Optionlal 获取他的一组任务

public Set<Quest> getAllUserStories(Long id)
    {
        Optional<Knight> knight = knightRepository.findById(id);
       Set<Quest>set = knight.stream().map(k->k.getQuests()).collect(Collectors.toSet());


        return listToReturn;
    }

Run Code Online (Sandbox Code Playgroud)

它几乎可以工作,但它的一套,我不知道如何在不设置的情况下夹住一些东西?另一个问题是,如果那组任务是空的,会在 null 上收集工作吗?

java jpa optional java-stream

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

为什么app在设置属性时会陷入无限循环?

1)这是我定义的自定义UITableViewCell:

class UserTableViewCell: UITableViewCell {

    var ou: OU? {
    set(newOU) {

        println(newOU)

        self.ou = newOU
    }   
}
Run Code Online (Sandbox Code Playgroud)

2)我正在将NSManagedObject传递给单元格

let s = sth.filteredSetUsingPredicate(NSPredicate(format: "someAttribute = true"))
let ou: OU = s.anyObject() as OU
cell.ou = ou
Run Code Online (Sandbox Code Playgroud)

3)它会多次写出这条日志消息,就像app会陷入无限循环一样.

可选((entity:OU; id:0x7a7e3590; data:{someAttribute = 1;}))

结论

基本上我只需要一个简单的存储属性,没有任何花哨的东西:

class UserTableViewCell: UITableViewCell {

    var ou: OU?
}
Run Code Online (Sandbox Code Playgroud)

properties core-data optional ios swift

0
推荐指数
1
解决办法
263
查看次数

Swift嵌套的非可选结构给出了可选的

我有以下代码:

struct Product {
    var image: URL!
    var title: String!
    var price: Price!
    var rating: Float!
    var url: URL!
}

struct Price {
    var value: Double!
    var currency: String!  // should be enum
}
Run Code Online (Sandbox Code Playgroud)

我后来初始化了一个Product:

product = Product(
    image: URL(string: "...")!,
    title: "...",
    price: Price(
        value: 5.99,
        currency: "CAD"
    ),
    rating: 4.5,
    url: URL(string: "...")!
)
Run Code Online (Sandbox Code Playgroud)

在运行时期间,product.price类型Price?I发现这很奇怪,因为它是隐式解包的.

我试过给出Price一个init()方法,结果相同.我也试过var price: Price! = Price(value: 0, currency: "CAD")Product定义中使用,结果相同.(我添加了一个成员初始化器Price …

struct optional swift

0
推荐指数
1
解决办法
113
查看次数

为什么类的init方法中不需要隐式可选项?

我正在关注Ray Wenderlich网站上关于Swift中的ARC的教程,我很想知道为什么在操场上创建一个类时可选的允许但不是隐式的可选项?

我到目前为止的游乐场代码是:

class User {
    var name: String
    init(name: String) {
        self.name = name
        print("User \(name) is initialized")
    }
    deinit {
        print("User \(name) is being deallocated")
    }
}

class Phone {
    let model: String
    var owner: User?
    init(model: String) {
        self.model = model
        print("Phone \(model) is initialized")
    }
    deinit {
        print("Phone \(model) is being deallocated")
    }
}

do {
    let user1 = User(name: "John")
}
let user2 = User.init(name: "Berry")
Run Code Online (Sandbox Code Playgroud)

在Phone类中,如果我将所有者变量更改为带有感叹号的隐式可选项,则操场不会抛出错误,但是如果我删除问号或不使其成为可选项,则会收到错误.

如果未设置,则隐式可选强制应用程序是否会崩溃?

感谢任何帮助,以深入了解为什么隐式可选项是可以的.

optional automatic-ref-counting swift

0
推荐指数
1
解决办法
42
查看次数