Questions tagged «java-8»

对于2014年3月18日发行的Java平台的第8版(内部版本1.8)特定于Java 8的问题,请使用此标记。在大多数情况下,您还应该指定java标记。

9
Java SE 8是否具有对或元组?
我正在玩Java SE 8中的惰性函数操作,我想要一个对对/元组map的索引,然后基于第二个元素,最后只输出索引。i(i, value[i])filtervalue[i] 我还必须忍受这一点吗:Java中的C ++ Pair <L,R>等效项是什么?在lambdas和stream的大胆新时代中? 更新:我提供了一个相当简化的示例,该示例在以下答案之一中提供了@dkatzel提供的简洁解决方案。但是,它不能一概而论。因此,让我添加一个更一般的示例: package com.example.test; import java.util.ArrayList; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { boolean [][] directed_acyclic_graph = new boolean[][]{ {false, true, false, true, false, true}, {false, false, false, true, false, true}, {false, false, false, true, false, true}, {false, …

3
每次执行时,lambda表达式都会在堆上创建一个对象吗?
当我使用Java 8的新语法糖遍历集合时,例如 myStream.forEach(item -> { // do something useful }); 这不等同于下面的“旧语法”代码段吗? myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } }); 这是否意味着Consumer每次迭代集合时都会在堆上创建一个新的匿名对象?这需要多少堆空间?它对性能有什么影响?这是否意味着在遍历大型多级数据结构时,我宁愿将旧样式用于循环?
182 java  lambda  java-8 

9
如何使用Java8 lambda反向排序流?
我正在使用Java lambda对列表进行排序。 如何以相反的方式对其进行排序? 我看到了这篇文章,但是我想使用java 8 lambda。 这是我的代码(我用* -1)作为hack Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(new Comparator<File>() { public int compare(File o1, File o2) { int answer; if (o1.lastModified() == o2.lastModified()) { answer = 0; } else if (o1.lastModified() > o2.lastModified()) { answer = 1; } else { answer = -1; } …

4
标准Kotlin库中提供了哪些Java 8 Stream.collect等效项?
在Java 8中,Stream.collect它允许对集合进行聚合。在Kotlin中,除了以stdlib中的扩展功能的集合形式存在之外,这并不完全相同。但尚不清楚不同用例的等效性。 例如,在JavaDocCollectors的顶部是为Java 8编写的示例,将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此可能应该以不同的方式编写它们。 在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,不能真正与相同的用例进行比较。有什么真正与案例相匹配的好示例,例如针对Java 8记录的案例Stream.collect?列表是: 将名称累积到列表中 将名称累积到TreeSet中 将元素转换为字符串并将其连接起来,并以逗号分隔 计算员工的薪金总额 按部门分组员工 按部门计算薪金总额 划分学生通过和失败 在上面链接的JavaDoc中有详细信息。 注意: 这个问题是作者故意写和回答的(“ 自我回答的问题”),因此SO中经常出现Kotlin主题的惯用答案。还要澄清一些针对Kotlin字母的非常古老的答案,这些答案对于当今的Kotlin而言并不准确。

5
使用流加BigDecimals
我有一个BigDecimals集合(在此示例中为LinkedList),我想将它们加在一起。是否可以为此使用流? 我注意到Stream该类有几种方法 Stream::mapToInt Stream::mapToDouble Stream::mapToLong 每种sum()方法都有一种方便的方法。但是,我们知道,float和double算术几乎总是一个坏主意。 那么,有没有一种方便的方法来汇总BigDecimals? 这是我到目前为止的代码。 public static void main(String[] args) { LinkedList<BigDecimal> values = new LinkedList<>(); values.add(BigDecimal.valueOf(.1)); values.add(BigDecimal.valueOf(1.1)); values.add(BigDecimal.valueOf(2.1)); values.add(BigDecimal.valueOf(.1)); // Classical Java approach BigDecimal sum = BigDecimal.ZERO; for(BigDecimal value : values) { System.out.println(value); sum = sum.add(value); } System.out.println("Sum = " + sum); // Java 8 approach …

7
Java 8:如何使用流中的异常抛出方法?
假设我有一个类和一个方法 class A { void foo() throws Exception() { ... } } 现在,我想为A流所传递的每个实例调用foo : void bar() throws Exception { Stream<A> as = ... as.forEach(a -> a.foo()); } 问题:如何正确处理异常?该代码无法在我的机器上编译,因为我不处理foo()可能引发的异常。在throws Exception的bar似乎是没用在这里。这是为什么?

2
通用返回类型上限-接口与类-出乎意料的有效代码
这是来自第三方库API的真实示例,但已简化。 与Oracle JDK 8u72一起编译 考虑以下两种方法: <X extends CharSequence> X getCharSequence() { return (X) "hello"; } <X extends String> X getString() { return (X) "hello"; } 两者都报告“未经检查的演员表”警告-我明白原因。让我感到困惑的是为什么我可以打电话 Integer x = getCharSequence(); 它可以编译吗?编译器应该知道Integer没有实现CharSequence。致电 Integer y = getString(); 给出错误(按预期) incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String 有人可以解释为什么将这种行为视为有效吗?有什么用? 客户端不知道此调用是不安全的-客户端的代码在编译时不会发出警告。为何编译器不会对此发出警告/发出错误? 此外,它与此示例有何不同: <X …
171 java  generics  java-8 

6
按Java 8流API分组
我尝试在Java 8流API中找到一种简单的方法来进行分组,我提出了这种复杂的方法! List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List<String[]> collect2 = collect .entrySet() .stream() .map(e -> new String[] { e.getKey(), String.valueOf(e.getValue().size()) }) .collect(Collectors.toList()); collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1])); 感谢您的投入。

5
箭头运算符'->'在Java中有什么作用?
在搜寻一些代码时,我遇到了箭头运算符,它究竟是做什么的?我以为Java没有箭头运算符。 return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> { return Car.SEDAN == ((Car)arg0).getStyle(); }); 详细信息:Java 6,Apache Commons Collection,IntelliJ 12 更新/答案:事实证明IntelliJ 12支持Java 8,后者支持lambda,并且正在“折叠”谓词并将其显示为lambda。下面是“展开”代码。 return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() { public boolean evaluate(Object arg0) { return Car.SEDAN == ((Car)arg0).getStyle(); } });

15
Java 8:Lambda-Streams,按方法进行过滤(异常)
我在尝试Java 8的Lambda表达式时遇到问题。通常它可以正常工作,但是现在我有抛出IOException的方法。最好查看以下代码: class Bank{ .... public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } .... } interface Account{ .... boolean isActive() throws IOException; String getNumber() throws IOException; .... } 问题是,它无法编译,因为我必须捕获isActive-和getNumber-Methods的可能异常。但是,即使我显式使用了如下所示的try-catch-Block,它仍然无法编译,因为我没有捕获到Exception。因此,或者JDK中存在错误,或者我不知道如何捕获这些异常。 class Bank{ .... //Doesn't compile …

8
Intellij-无法使用较新的Java 8类-错误:“ API的使用记录为@@ 1.6起。”
我正在尝试java.lang.function.Function在Java 8代码库中使用A,但在Intellij中却不断收到以下错误。 API的使用记录为@since 1.6+起此检查将发现其文档中具有@since标记的方法的所有用法。当在更新的SDK版本下执行开发作为生产的目标平台时,这可能会很有用 我似乎有正确的项目和编译器设置 项目设置:(文件->项目结构) Project Settings -> Project -> Project SDK = Java 1.8 Project Settings -> Project -> Project Language Level = 8 - Lambdas, Type Annotations etc 编译器设置:(文件->设置) Build, Execution, Deployment -> Compiler -> Java Compiler -> Project Bytecode Version : 1.8 Build, Execution, Deployment -> …

8
向流中添加两个Java 8流或一个额外的元素
我可以添加流或其他元素,如下所示: Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)); 我可以随时添加新内容,例如: Stream stream = Stream.concat( Stream.concat( stream1.filter(x -> x!=0), stream2) .filter(x -> x!=1), Stream.of(element)) .filter(x -> x!=2); 但这是丑陋的,因为concat是静态的。如果concat是实例方法,则上面的示例将更容易阅读: Stream stream = stream1.concat(stream2).concat(element); 和 Stream stream = stream1 .filter(x -> x!=0) .concat(stream2) .filter(x -> x!=1) .concat(element) .filter(x -> x!=2); 我的问题是: 1)是否有充分的理由为什么它concat是静态的?还是我缺少一些等效的实例方法? 2)无论如何,有没有更好的方法?


9
我应该返回收藏集还是流?
假设我有一个将只读视图返回到成员列表的方法: class Team { private List < Player > players = new ArrayList < > (); // ... public List < Player > getPlayers() { return Collections.unmodifiableList(players); } } 进一步假设所有客户要做的就是立即遍历列表一次。也许将播放器放入JList之类。客户端就不能存储到列表的引用以便稍后进行检查! 在这种常见情况下,我应该返回流吗? public Stream < Player > getPlayers() { return players.stream(); } 还是在Java中返回流非惯用语?流是否设计为始终在创建它们的相同表达式内被“终止”?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.