任何人都可以描述这种代码来理解Java封闭.
public static <T> void sort(List<T> l, final {T, T=>Number} block) {
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
return block.invoke(arg0, arg1);
}
}
}
Run Code Online (Sandbox Code Playgroud) 根据:http: //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#lambda-expressions-in-gui-applications
先前:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
Run Code Online (Sandbox Code Playgroud)
现在,我们可以:
btn.setOnAction(
event -> System.out.println("Hello World!")
);
Run Code Online (Sandbox Code Playgroud)
现在,我在使用Java库时尝试在Scala中执行此操作.
我正在使用JavaFX(Java 1.8 SE中默认包含它).尝试:
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
Error:(204, 46) type mismatch;
found : javafx.scene.input.MouseEvent => Unit
required: javafx.event.EventHandler[_ >: javafx.scene.input.MouseEvent]
chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
^
Run Code Online (Sandbox Code Playgroud)
旧样式很好用:
chart.setOnMouseClicked( new EventHandler[MouseEvent] {
override def handle(event: MouseEvent): Unit = println("NOT NOICE")
} )
Run Code Online (Sandbox Code Playgroud)
我在IntelliJ中将项目语言级别设置为Java 8,我使用的是Scala 2.11.1,以及来自Oracle 1.8.0_05的Java
我在这里错过了什么?或者是否根本无法将Scala中的lambda表达式传递给Java,就像在上述示例中所做的那样?
使用FXML的JavaFX的MVC模型听起来很棒,但我很难找到如何组织我的项目包.
我发现的关于JavaFX的每一个教程都过于简单和无组织:他们只需创建一个包并在那里创建所有内容,每个控制器,每个fxml,每个css.我不想那样.我希望事情能在正确的位置.
尽管如此,JavaFX的"路径"似乎......"有限".使用URL使得如果我想将资源限制为本地文件,我必须完成所有工作getClass().getResource("foo.fxml").openStream().这很好,但是通过从类路径获取资源,路径来自类所在的包.我有点想要项目的根.这会简化我的生活,但JavaFX似乎并没有像这样工作.
让我们来看一个实际的例子:
想象一下,我有一个FXML"登录屏幕".想象一下,我希望登录屏幕使用样式表.理想情况下,该css将与该fxml位于同一个包中.但是,如果我想在另一个FXML中使用相同的.css呢?这是否意味着我必须将两个FXML放在同一个包中?显然我"不需要",但我该怎么做呢?
另外,假设我想在正确登录时更改场景.在FXML Controller适当的事件中,我将不得不调用"setScene".如果我在不同的包装中使用FXML,那么这条路也很难获得.似乎所有东西都在一个巨大的膨胀包中,或者一切都很难进入而不诉诸"../../dir"之类的黑客.
http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm中的Henley Sales应用程序似乎是一个组织良好的应用程序的示例,尽管该应用程序是单个TabPane.不幸的是(至少我认为)来源不公开.它的想法是这样的:
Run Code Online (Sandbox Code Playgroud)client Main.class styles.css client.images image.png client.screen1 Screen1.fxml Screen1Controller.java client.screen2 Screen2.fxml Screen2Controller.java ...
这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题).
对于'The Henley Sales',它很聪明,有一个Main可以调用其中一个包'FXML(易于访问,FXML的目录在Main类之下).不过,对于样式表,这必须是硬编码的scene.getStylesheets().add(...);.我真的更愿意选择在FXML中选择样式表.Afterall,stylesheet是View组件的一部分.从FXML中的URL访问.css文件对于这种结构来说会有点困难,因为它位于其目录之上.
此外,通过这个组织,我如何才能合理地改变场景?在这个项目中,这不是必需的,因为整个项目是一个TabbedPane.主叫它,它完成了.无需更多交换.但是一个简单的登录场景(或者为什么需要交换整个场景的原因)需要访问FXML路径.
然后是资源.Css文件可能需要使用图像.该结构通过将.css文件放在顶部,并为.css可能需要的文件创建一个包来解决它.如果我想要一个特定的FXML有一个不同的.css,那么,另一个问题就会到来.
这似乎是一个循环.Css需要访问共享资源文件夹.FXML需要访问Css.FXML的控制器需要访问其他FXML.我希望我清楚我的项目结构存在疑虑.请帮我创建一个JavaFX项目结构,该结构对于超过基本的应用程序来说足够强大,或者将我重定向到一些好的源代码.
哦,我顺便使用Netbeans.
我正在阅读Java 8,特别是"Streams API".我想知道流是如何懒惰的?
我相信流只是作为一个库添加,并且没有对语言进行任何更改来支持懒惰.另外,如果有人告诉我这是通过反思实现的,我会感到震惊.
假设我有一个给定名称,姓氏对的地图,我想找到该地图中第一个条目的名称,该名称的姓氏与某个值相匹配.我们如何以java 8的方式做到这一点.
在我下面的测试用例中,我提出了两种方法.
然而,第一个(寻找姓氏为"Donkey"的第一个人的名字)将抛出java.util.NoSuchElementException:没有值存在,因此它不安全.
第二个工作,但它不仅难以阅读,但它有点不太实用.
只是不知道是否有人在这里会建议我实现这个要么使用一个更简单更清晰的方式stream()或forEach()或两者兼而有之.
@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
Map<String, String> names = new LinkedHashMap<>();
names.put("John", "Doe");
names.put("Fred", "Flintstone");
names.put("Jane", "Doe");
String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
assertEquals("John", keyOfTheFirst);
try {
names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
} catch (NoSuchElementException e){
// Expected
}
Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;
assertNull(keyOfTheFirst);
}
Run Code Online (Sandbox Code Playgroud)
先感谢您.
我是java.time包的新手.我有一个LocalDate 2015-12-10.我需要将其转换为ZonedDateTime.时间应为00:00:00,区域为ZoneOffset.UTC.
转换后,ZonedDateTime应为2015-12-10T00:00:00 + 02:00.
我将LocalDate存储在名为startDate的变量中.
我试过了:
ZonedDateTime.ofInstant(Instant.from(startDate), ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)
但得到错误
java.time.DateTimeException:无法从TemporalAccessor获取Instant:2015-12-10,类型为java.time.LocalDate]
我也尝试过:
startDate.atStartOfDay().atZone(ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)
这给出了意外的结果.
我查看了API并尝试了其他一些方法,但到目前为止还没有运气.
有没有其他方法可以将LocalDate转换为ZonedDateTime?
我学习了Java 8的新功能.
我正在玩不同的例子,我发现了一个奇怪的行为:
public static void main(String[] args) {
method(Test::new);
}
static class Test{
}
private static void method(Supplier<Test> testSupplier){
Test test = testSupplier.get();
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译成功,但我不知道它是如何工作的.
为什么可以Test::new接受供应商?
供应商界面看起来很简单:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Run Code Online (Sandbox Code Playgroud) Interface AccountService{
public void createAccount();
}
AccountService accountServiceAnonymous = new AccountService(){
public void createAccount(){
Account account = new Account();
save(account);
}
};
AccountService accountServiceLambda = () -> {
Account account = new Account();
save(account);
}
Run Code Online (Sandbox Code Playgroud)
除了减少代码行数之外,在java 8中使用lambda表达式还有什么其他优点吗?
我想迭代堆栈跟踪.stacktrace由throwables组成,其getCause()返回下一个throwable.对getCause()的最后一次调用返回null.(示例:a - > b - > null)
我试图使用Stream.iterable()导致NullPointerException,因为iterable中的元素不能为null.以下是该问题的简短演示:
public void process() {
Throwable b = new Throwable();
Throwable a = new Throwable(b);
Stream.iterate(a, Throwable::getCause).forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用while循环手动创建集合:
public void process() {
Throwable b = new Throwable();
Throwable a = new Throwable(b);
List<Throwable> list = new ArrayList<>();
Throwable element = a;
while (Objects.nonNull(element)) {
list.add(element);
element = element.getCause();
}
list.stream().forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法(更短,更实用)来实现这一目标?
给定一个String s和char c,我很好奇,如果存在制造的一些方法List<Integer> list从s(其中内的元素list表示的索引c内s).
一个接近但不正确的方法是:
public static List<Integer> getIndexList(String s, char c) {
return s.chars()
.mapToObj(i -> (char) i)
.filter(ch -> ch == c)
.map(s::indexOf) // Will obviously return the first index every time.
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
以下输入应产生以下输出:
getIndexList("Hello world!", 'l') -> [2, 3, 9]
Run Code Online (Sandbox Code Playgroud) java-8 ×10
java ×7
java-stream ×4
lambda ×3
javafx ×2
collections ×1
css ×1
fxml ×1
java-9 ×1
java-time ×1
javafx-8 ×1
optional ×1
organization ×1
scala ×1
string ×1