Tag: java 8

在Swing应用程序内部的javax.swing.Timer与java.util.Timer

最好在swing应用程序中使用javax.swing.Timer而不是使用java.util.Timer ? 例如: Timer timer = new Timer(1000, e -> label.setText(new Date().toString())); timer.setCoalesce(true); timer.setRepeats(true); timer.setInitialDelay(0); timer.start(); 要么 new java.util.Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { label.setText(new Date().toString()); } }, 0, 1000); 这两个有什么区别吗?

关于实例创建的Java 8注释

在Javadocs for Annotations中,它声明以下内容可以用Java 8编写: new @Interned MyObject(); 无论如何都要从通过reflection注释的对象中检索注释@Interned? 我熟悉从方法,字段,类等中检索注释的典型方法,但我想知道在Java 8中是否可以在运行时将特定实例与注释相关联。

创建lambda表达式的字符串表示

出于调试目的,我试图在Java 8中创建lambda表达式的字符串表示(特别是Predicate s,尽管它对其他lambda表达式也很有意义)。我的想法是这样的: public class Whatever { private static String predicateToString(Predicate predicate) { String representation = … // do magic return representation; } public static void main(String[] args) { System.out.println(Whatever.predicateToString(i -> i % 2 == 0)); } } 输出将是i -> i % 2 == 0 (或逻辑等价的东西)。 toString()方法似乎没有任何帮助,输出就像com.something.Whatever$$Lambda$1/1919892312@5e91993f (我想这是因为toString()没有被覆盖)。 我不确定这样的东西是否可能,例如reflection,到目前为止我当然无法找到任何东西。 有任何想法吗?

使用流API查找列表中项目的所有索引

我正在尝试使用Java 8流和lambda表达式进行顺序搜索。 这是我的代码 List list = Arrays.asList(10, 6, 16, 46, 5, 16, 7); int search = 16; list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e))); Output: 2 2 我知道list.indexOf(e)总是打印第一次出现的索引。 如何打印所有索引?

是否可以在运行时检索lambda表达式

我昨晚玩Java8 Lambda,我想知道是否可以在运行时检索Lambda表达式。 简而言之,据我所知,Lambda表达式在运行时转换为(静态)方法,然后使用InvokeDynamics调用。 我们举个这样的例子: people.filter(person -> person.getAge() >= minAge); filter是一个以Predicate为参数的自定义方法。 在这个filter方法中,我怎样才能以与Lambda表达式相似(或相同)的forms检索参数( person -> person.getAge() >= minAge )? 我试图使用ASM5_BETA读取参数类的生成字节码,但是我无法使用ClassVisitor和MethodVisitor来访问与Lambda表达式相关联的方法。 public List filter(Filter expression) { try { Class expressionClass = expression.getClass(); byte[] content = getClassContent(expressionClass); ClassReader classReader = new ClassReader(content); classReader.accept(new PredicateClassVisitor(), 0); } catch (Throwable e) { e.printStackTrace(); } return null; } private byte[] getClassContent(Class expressionClazz) […]

为什么@FunctionalInterface具有RUNTIME保留?

在Javadoc中说 : 如果使用此批注类型对类型进行批注,则编译器需要生成错误消息,除非… 为什么SOURCE或CLASS不够,比如@Override 。

JavaFX 8中的常规exception处理

给定一个Scene的控制器调用业务代码,该代码引发exception。 我怎样才能以一般方式处理这种exception? 我尝试了Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)方法但是没有调用它,所以我相信exception会被Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)到JavaFX框架内的某个地方。 我该怎么做才能处理此exception或至少向用户显示一些有用的信息?

获取数字流的范围

给定DoubleStream s ,我可以执行s.min()或s.max()但不能同时执行两者,因为其中任何一个都将使用流。 现在假设我有 class Range /* can add code here */ { private final double min; private final double max; Range(double min, double max){ this.min = min; this.max = max; } // can add code here } 我怎样才能获得流的范围? (除了通过s.collect(Collectors.toList()); new Range(s.stream().min(),s.stream().max()); )

如何将Optional转换为OptionalInt?

我有一个可Optional ,我想“转换”为OptionalInt ,但似乎没有一个简单的方法来做到这一点。 这就是我想要做的(人为的例子): public OptionalInt getInt() { return Optional.ofNullable(someString).filter(s -> s.matches(“\\d+”)).mapToInt(Integer::parseInt); } 但是, mapToInt()方法没有。 我能想到的最好的是: return Optional.ofNullable(someString) .filter(s -> s.matches(“\\d+”)) .map(s -> OptionalInt.of(Integer.parseInt(s))) .orElse(OptionalInt.empty()); 但这似乎不够优雅。 我是否遗漏了JDK中可以使转换更优雅的东西?

Java8流:将值转换为列表的转置映射

我有键映射为String,值为List。 列表可以有10个唯一值。 我需要将此映射转换为键为Integer,将值转换为List。 示例如下: 输入: “关键1”:1,2,3,4 “Key-2”:2,3,4,5 “Key-3”:3,4,5,1 预期产量: 1:“Key-1”,“Key-3” 2:“Key-1”,“Key-2” 3:“Key-1”,“Key-2”,“Key-3” 4:“Key-1”,“Key-2”,“Key-3” 5:“Key-2”,“Key-3” 我知道使用for循环我可以实现这一点,但我需要知道这可以通过java8中的streams / lamda完成。 -谢谢。