为什么这会抛出一个java.lang.NullPointerException ? List<String> strings = new ArrayList<>(); strings.add(null); strings.add("test"); String firstString = strings.stream() .findFirst() // Exception thrown here .orElse("StringWhenListIsEmpty"); //.orElse(null); // Changing the `orElse()` to avoid ambiguity strings的第一项是null ,这是一个完全可以接受的值。 此外, findFirst()返回一个Optional ,这对于findFirst()能够处理null来说更为findFirst() 。 编辑:更新orElse()更不明确。
声明函数来映射值并消耗它们(如果存在的话)是很方便的。 在这种情况下,你有几个强制性对象和几个选项,我发现自己也包装在Optional.of(mandatoryObject)中,所以我可以在它们上使用相同的expression式而不用全部写回。 Food vegetables = Food.someVegetables(); Optional<Food> condiment = Food.someCondiment(); Optional<Food> spices = Food.someSpices(); condiment.map(prepare).ifPresent(putOnPlate); spices.map(prepare).ifPresent(putOnPlate); 但是,我不喜欢这个代码: putOnPlate.accept(prepare.apply(vegetables)); 所以我把它包起来: Optional.of(vegetables).map(prepare).ifPresent(putOnPlate); 但这是错误的,因为蔬菜(在这个例子中)实际上并不是可选的。 他们是非常重要的,我给大家的印象是他们是可选的。 所以我的问题是:是否有像java.util.Mandatory java中的一些类,所以我可以写: Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);
Swift手册第61页的Swift文档提示可以使用wherejoin一个可选的绑定和一个常规条件。 然而,当我这样做时,我有一个警告,build议我用下面的一段代码replace逗号: if let geocodingError = error as? NSError where geocodingError.code == 2
我想在一个if语句中打开两个选项,但是编译器抱怨操作符在密码常量之后的预期expression式。 可能是什么原因? if let email = self.emailField?.text && let password = self.passwordField?.text { //do smthg } 在Swift中完成。
可选用来表示可空对象,这个类的一些用法包括 作为返回types的方法,作为返回null的替代方法 表示没有可用的值 为了区分“未知”(例如,不存在于地图中)和“已知没有价值”(存在于地图中,具有值 Optional.absent()) 要将不可用的引用存储在不支持null的集合中(尽pipe还有其他几种应该首先考虑的方法) 对于第一种情况,我是否需要返回可选的所有可空的返回方法?
当我想检查一个可选的布尔是否为真,这样做是行不通的: var boolean : Bool? = false if boolean{ } 它导致这个错误: 可选types“@IvalueBool?” 不能用作布尔值; testing'!= nil'代替 我不想检查零; 我想检查返回的值是否为真。 如果我正在使用可选Bool,那么我是否总是必须要做if boolean == true ? 由于Optionals不再符合BooleanType ,编译器不知道我想检查Bool的值吗?
在Swift中,如何在switch语句中编写一个case来testing与可选内容切换的值,如果可选包含nil ,则跳过该情况? 以下是我可以想象的: let someValue = 5 let someOptional: Int? = nil switch someValue { case someOptional: // someOptional is non-nil, and someValue equals the unwrapped contents of someOptional default: // either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional } 如果我只是这样写的,编译器会抱怨someOptional可选项没有解开,但是如果我通过添加来明确地解开它! 到最后,我当然会得到一个运行时错误,任何时候someOptional包含nil 。 添加? 而不是! […]
我想了解Optional<T>.orElse()和Optional<T>.orElseGet()方法之间的区别。 orElse()方法的描述是“返回值如果存在,否则返回其他”。 而orElseGet()方法的描述是“返回值,如果存在,否则调用其他值并返回该调用的结果”。 orElseGet()方法采用供应商function接口,基本上不采用任何参数并返回T 在哪种情况下你需要使用orElseGet() ? 如果你有一个方法T myDefault()为什么你不只是做optional.orElse(myDefault())而不是optional.orElseGet(() -> myDefault()) ? orElseGet()似乎并没有推迟lambdaexpression式的执行到某个更晚的时间或什么,所以它有什么意义呢? (我会认为它会更有用,如果它返回一个更安全的Optional<T>其get()永远不会抛出一个NoSuchElementException和isPresent()总是返回true …但显然它不是,它只是返回T like orElse() )。 还有一些其他的差异我失踪了吗?
鉴于: typealias Action = () -> () var action: Action = { } func doStuff(stuff: String, completion: @escaping Action) { print(stuff) action = completion completion() } func doStuffAgain() { print("again") action() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() 有什么办法可以使Action?types的completion参数(和action ) Action? 并保持@escaping ? 更改types会导致以下错误: error: @escaping attribute only applies to function types 除去@escaping属性,代码编译并运行,但是由于completion闭包正在逃避函数的作用域,所以似乎并不正确。
我正在使用Boost程序选项库来parsing命令行参数。 我有以下要求: 一旦提供“帮助”,所有其他选项都是可选的; 一旦“帮助”没有提供,所有其他选项是必需的。 我如何处理这个? 这是我的代码处理这个,我发现它是非常多余的,我认为必须有一个容易做的,对吧? #include <boost/program_options.hpp> #include <iostream> #include <sstream> namespace po = boost::program_options; bool process_command_line(int argc, char** argv, std::string& host, std::string& port, std::string& configDir) { int iport; try { po::options_description desc("Program Usage", 1024, 512); desc.add_options() ("help", "produce help message") ("host,h", po::value<std::string>(&host), "set the host server") ("port,p", po::value<int>(&iport), "set the server port") ("config,c", […]