我以前读了几篇Java 8教程.
现在我遇到了以下主题: java支持Currying吗?
在这里,我看到以下代码:
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
System.out.println(curriedAdd.apply(1).applyAsInt(12));
Run Code Online (Sandbox Code Playgroud)
我明白这个例子总结了2个元素,但我无法理解构造:
a -> b -> a + b;
Run Code Online (Sandbox Code Playgroud)
根据表达式的左侧部分,该行应实现以下功能:
R apply(int value);
Run Code Online (Sandbox Code Playgroud)
在此之前,我只用一支箭只遇到了lambdas.
除了保存代码行之外,lambda表达式还有什么用处吗?
lambda提供的特殊功能是否解决了不容易解决的问题?我见过的典型用法是代替写这个:
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
};
Run Code Online (Sandbox Code Playgroud)
我们可以使用lambda表达式来缩短代码:
Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());
Run Code Online (Sandbox Code Playgroud) 阅读Java-8规范,我不断看到对"SAM类型"的引用.我无法找到明确解释这是什么.
什么是SAM类型以及什么是何时可以使用的示例场景?
Google Guava有一个始终返回true的谓词.Java 8有类似的东西Predicate吗?我知道我可以使用(foo)->{return true;},但我想要预制的东西,类似于Collections.emptySet().
在Java 8中使用默认方法作为穷人的特征是一种安全的做法吗?
一些人声称如果你只是为了它而使用它们可能会让熊猫感到悲伤,因为它很酷,但这不是我的意图.还经常提醒的是,引入了默认方法来支持API演变和向后兼容性,这是事实,但这并不会使它们错误或扭曲以将它们用作特征本身.
我有以下实际用例:
public interface Loggable {
default Logger logger() {
return LoggerFactory.getLogger(this.getClass());
}
}
Run Code Online (Sandbox Code Playgroud)
或许,定义一个PeriodTrait:
public interface PeriodeTrait {
Date getStartDate();
Date getEndDate();
default isValid(Date atDate) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
无可否认,可以使用组合(甚至是辅助类),但它看起来更冗长,更混乱,并且不允许从多态性中受益.
那么,使用默认方法作为基本特征是否可行/安全,还是应该担心不可预见的副作用?
关于SO的几个问题与Java vs Scala特征有关; 这不是重点.我也不仅仅是在征求意见.相反,我正在寻找一个权威的答案或至少是现场洞察力:如果你在公司项目中使用默认方法作为特征,那么它是否真的是一个时间炸弹?
有没有一种简单的方法将LocalDate(用Java 8引入)转换为java.util.Date对象?
通过'简单',我的意思是比这更简单:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点尴尬.
由于我们只对日期部分感兴趣,并且两个对象中都没有时区信息,为什么要明确引入时区?应该隐式采用午夜时间和系统默认时区进行转换.
我正在阅读有关Java流和发现新事物的内容.我发现的新事物之一是peek()功能.几乎所有我读过的内容都说它应该用来调试你的Streams.
如果我有一个Stream,每个帐户都有一个用户名,密码字段以及login()和loggedIn()方法,该怎么办?
我也有
Consumer<Account> login = account -> account.login();
Run Code Online (Sandbox Code Playgroud)
和
Predicate<Account> loggedIn = account -> account.loggedIn();
Run Code Online (Sandbox Code Playgroud)
为什么会这么糟糕?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在据我所知,这完全符合它的目的.它;
做这样的事情的缺点是什么?有什么理由我不应该继续吗?最后,如果不是这个解决方案呢?
其原始版本使用.filter()方法如下;
.filter(account -> {
account.login();
return account.loggedIn();
})
Run Code Online (Sandbox Code Playgroud) 在Java 8中,如何将Timestamp(in java.sql)转换为LocalDate(in java.time)?
最近我正在阅读Spring Framework的源代码.我无法理解的东西在这里:
public Member getMember() {
// NOTE: no ternary expression to retain JDK <8 compatibility even when using
// the JDK 8 compiler (potentially selecting java.lang.reflect.Executable
// as common type, with that new base class not available on older JDKs)
if (this.method != null) {
return this.method;
}
else {
return this.constructor;
}
}
Run Code Online (Sandbox Code Playgroud)
此方法是类的成员org.springframework.core.MethodParameter.代码很容易理解,而评论很难.
注意:即使使用JDK 8编译器,也没有三元表达式来保持JDK <8的兼容性(可能选择
java.lang.reflect.Executable为通用类型,旧的JDK上没有新的基类)
if...else...在这种情况下使用三元表达和使用构造有什么区别?
我在接受采访时被问到这个问题,我不相信我能给出最好的答案.我提到你可以进行并行搜索,并且通过某些我无法记住的方法处理空值.现在我意识到我在想Optionals.我在这里错过了什么?他们声称它的代码更好或更简洁,但我不确定我是否同意.
考虑到它的回答是多么简洁,看起来这毕竟不是一个问题.
如果他们在面试中提出这个问题,而且显然是这样,除了让更难找到答案之外,还有什么目的可以打破它?我的意思是,你在找什么?我可以打破这个问题并解决所有子问题但是然后创建一个包含所有子项的链接的父问题......虽然看起来很傻.虽然我们在这,但请举一个不太广泛的问题的例子.我知道没有办法只问这个问题的一部分,仍然得到一个有意义的答案.我可以用不同的方式问同一个问题.例如,我可以问"流服务的目的是什么?" 或"我什么时候使用流而不是for循环?" 或"为什么要打扰流而不是循环?" 这些都是完全相同的问题.
......还是被认为过于宽泛,因为有人给出了一个非常长的多点答案?坦率地说,知情人士几乎可以解决任何问题.例如,如果您恰好是JVM的作者之一,那么当我们大多数人不能这样做时,您可能会整天谈论for循环.
"请编辑问题,将其限制在具有足够详细信息的特定问题上,以确定适当的答案.避免同时询问多个不同的问题.请参阅"如何询问"页面以获取有关此问题的帮助.
如下所述,已经给出了足够的答案,证明存在一个并且很容易提供.