这个页面有一个Swift选项的"简单"解释.
那家伙有疯狂的例子,像这样:
if let p = partitionArray([1, 2, 3, 4] as NSArray?) {
// this code will be called
}
if let p = partitionArray([1, 2, 3] as NSArray?) {
// this code won't be called
}
Run Code Online (Sandbox Code Playgroud)
你好吗?这些代码对我来说是相同的,除了第二个数组少了一个元素.为什么第二个不会执行是黑魔法或该家伙吸烟真的很糟糕的东西.
他举了另一个例子:
partitionArray([1, 2, 3, 4] as NSArray?)![0] // will work fine
partitionArray([1, 2, 3] as NSArray?)![0] // will crash
Run Code Online (Sandbox Code Playgroud)
同样的事情.
如果这是一个简单的解释我不明白.你们能解释一下吗?
在Swift 1.2中,以下内容
let cell = tableview.dequeueReusableCellWithIdentififer("mycell"), forIndexPath: indexPath) as UITableViewCell
Run Code Online (Sandbox Code Playgroud)
现在一定要用!
let cell = tableview.dequeueReusableCellWithIdentififer("mycell"), forIndexPath: indexPath) as! UITableViewCell
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,单元格可以是零?对于常数为零而言似乎很奇怪.
在第二个例子中,Swift确保在编译时有一个值?
以下方法实现了一个BiFunctiona Map<String,String>和一个值来搜索.它搜索的Entry在Map包含给定值,并返回相应的键.
这个实现有效,但是我想写一个没有return语句的lambda表达式,以使代码更优雅.
private BiFunction<Map<String, String>, String, String> findName = (m, s) -> {
Map.Entry<String, String> e =
m.entrySet()
.stream()
.filter(entry -> entry.getValue() != null && !entry.getValue().isEmpty() && entry.getValue().equals(s))
.findFirst()
.orElse(null);
return e != null ? e.getKey() : null;
};
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我目前正在尝试制作类似于master password 的我自己的密码管理器应用程序,它使用一种算法来生成密码,因此它们不必存储在客户端计算机上或在线。
为了实现这一点,我决定使用使用CryptoSwift库的 ChaCha20 密码算法。这是我目前拥有的代码(OS X 应用程序):
import Cocoa
import CryptoSwift
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var window: NSWindow!
func applicationDidFinishLaunching(aNotification: NSNotification) {
do
{
let UInt8String = "Test".utf8
print("UTF8 string: \(UInt8String)")
let UInt8Array = Array(UInt8String)
print("UTF8 array: \(UInt8Array)")
let encrypted = try ChaCha20(key: "Key", iv: "Iv")!.encrypt(UInt8Array)
print("Encrypted data: \(encrypted)")
} catch _ {
}
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}
Run Code Online (Sandbox Code Playgroud)
我得到错误的那一行是 …
有人可以解释为什么java人会覆盖hascodein 的目的Optional
我想简化代码(例如使用Optionals)
private String formatValue(Object value) {
if (value == null) {
return null;
} else if (value instanceof Date) {
return MyUtils.formatDate((Date)value, Constant.DATE_FORMAT_YYYYMMDD_HHMMSS);
}
return value.toString();
}
Run Code Online (Sandbox Code Playgroud)
值可以是:null,String,Date
我知道 SO 上有多个问题与这个问题非常相似,但我找不到我希望得到的解决方案。
我的用例在这里非常简单。我有一个 Optional 对象,如果 Optional 中的对象存在,我想从 Optiona 对象返回一个值。例如,我想做这样的事情:
private String getUserName(String id) {
// this doesn't work
return fetchUser(id).ifPresent(user -> user.getName()).orElse("DEFAULT_NAME");
}
private Optional<User> fetchUser(String id) {
try {
return Optional.ofNullable(searchUser(id));
} catch (Exception e) {
LOGGER.error("User not found with id {}", id);
return Optional.empty();
}
}
Run Code Online (Sandbox Code Playgroud)
我当然试图避免if这里的块,我也知道它ifPresent需要 a Consumer,因此里面的任何东西ifPresent都不会返回任何值。但是有没有办法像上面那样以更优雅的方式实现这一点。解决这个问题的方法当然是重新编写如下代码:
private String getUserName(String id) {
// return fetchUser(id).ifPresent(user -> user.getName()).orElse("DEFAULT_NAME");
Optional<User> user = fetchUser(id);
if(user.isPresent()) {
return user.get().getName();
} else { …Run Code Online (Sandbox Code Playgroud) 据我了解,以下代码不应抛出,Null Pointer exception因为我正在安全地使用 Optional 接口。
但是,当我运行此代码时,它会抛出NPE.
public class Test {
public static void main(String[] args) {
final Integer inte = false ? 0 : Optional.ofNullable((Integer) null).orElse(null);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在代码中的某个地方弄错了,请告诉我并帮助我纠正相同的错误。
哪个在实践中更好?有可选列表或列表中有可选项吗?
目前我正在关注一个可选列表.
列出[选项[T]]或选项[列表[T]]?
编辑:
我遇到的问题是我有crud操作,我正在返回可选类型.我有一种情况,我有一个方法,只进行一次查找,我想利用它来创建一个返回列表的函数.我仍然在用scala弄湿我的脚,所以我很好奇最佳做法是什么.
例:
def findOne(id: Int): Option[T]
Run Code Online (Sandbox Code Playgroud)
无论实现我想用它来做这样的事情,但哪个更好?它们似乎都很奇怪.也许我总是缺少一些东西:
def find(ids: List[Int]) : Option[List[T]]
Run Code Online (Sandbox Code Playgroud)
VS
def find(ids: List[Int]) : List[Option[T]]
Run Code Online (Sandbox Code Playgroud) 在Scala中,我可以getOrElse方便地从中获取默认值Option,Rust中的等效值是什么?
val threeOpt = Some(3)
val shouldBeThree = threeOpt.getOrElse(-1) // got 3
Run Code Online (Sandbox Code Playgroud) 我不知道是谁负责这种工作,但对我来说,Javas Optional似乎还没有为制作做好准备.似乎Java Creators只是分层来完成工作,结果是一个没有准备好的可选类,缺少很多功能.
例如,考虑ifPresent方法.返回类型是void,但它可能是一个实例,只是在流框架中有类似peek的东西.把这个返回到一个方法中并不是什么大不了的事情,但不这样做意味着关于可选的思考不是生产就绪的.
另一个例子是缺少经过检查的方法,认为映射或过滤可能会引发异常,导致很多try catch样板.相反,他们只是添加了一个UncheckedIOException.样板仍然存在.我的意思是添加检查方法也是如此困难?
A可以给你更多的例子,但我不想把我的精力和时间投入到非完整的类中,比如可选的.我开始创建一个可选的替代品,我将来可能会将其作为一个开源项目发布.我实现的唯一缺点是可以将我的可选类与流框架结合起来,其中findAny或findFirst等方法返回我想要替换的Optional类型.我需要面对的这个问题,因为当然可选的需要是最终的.
我不知道什么是最好处理这种情况所以我希望这里有人可以给我一个很好的提示.
提前致谢.
编辑:我的确觉得这里有些人懒得看我的帖子,所以我想把事情搞清楚.
如果我说ifPresent应该返回这个当然我不能意味着Optional持有的值.它意味着"this"实例,以便您可以使用下一个命令进行链接,就像在流框架中查看一样.
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
Run Code Online (Sandbox Code Playgroud)
这是当前在Java8中使用的Optional的原始代码.如果您对该功能有所了解,可以这样写:
public OptionalReplacement<T> ifPresent(Consumer<? super T> consumer) {
requireNonNull(consumer);
if (isPresent()) {
consumer.accept(value);
}
return this;
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以写出像
OptionalReplacement.of(nullable)
.ifPresent(notNull-> System.out.println(notNull))
.ifPresent(notNull-> System.out.println(notNull))
Run Code Online (Sandbox Code Playgroud)
没有理由将ifPresent视为无效并返回,这使您可以更灵活地进行链接.你能用当前的可选类进行那种链接,不!
下一个主题是已检查的例外.因为有些人没有幻想,我会给你一个处理检查异常的可能地图的例子.
@FunctionalInterface
public interface CheckedFunction<T, R, E extends Exception> {
R apply(T t) throws E;
}
public <U, E extends Exception> OptionalReplacement<U> checkedMap(Class<E> exceptionClass, CheckedFunction<? super T, ? extends U, E> mapper) …Run Code Online (Sandbox Code Playgroud) optional ×11
java ×6
java-8 ×5
swift ×2
api ×1
api-design ×1
cryptoswift ×1
encryption ×1
hashcode ×1
instanceof ×1
lambda ×1
monads ×1
null ×1
object ×1
rust ×1
scala ×1
swift2 ×1