Questions tagged «java-8»

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

5
Java 8是否提供了一种重复值或函数的好方法?
在许多其他语言中,例如。Haskell,很容易多次重复一个值或函数,例如。获取值的8个副本的列表1: take 8 (repeat 1) 但是我还没有在Java 8中找到它。Java 8的JDK中是否有这样的功能? 或替代等效范围 [1..8] 似乎可以明显替代Java中的冗长语句 for (int i = 1; i <= 8; i++) { System.out.println(i); } 有类似的东西 Range.from(1, 8).forEach(i -> System.out.println(i)) 尽管这个特定示例实际上看起来不那么简洁...但是希望它更具可读性。
117 java  java-8 

6
单行获取Stream / List的最后一个元素
如何在以下代码中获取流或列表的最后一个元素? 哪里data.careas是List<CArea>: CArea first = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? 如您所见,获得第一个元素一定filter并不困难。 但是,获得单线的最后一个要素确实是一个痛苦: 看来我无法直接从Stream。(仅对有限的流有意义) 这似乎也不能得到像first()和last()从List接口,这实在是一种痛苦。 我看不到在接口中不提供first()and last()方法的任何参数List,因为其中的元素是有序的,而且大小是已知的。 但是按照原始答案:如何获得有限的最后一个元素Stream? 就个人而言,这是我能得到的最接近的结果: int lastIndex = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt(); CArea last = data.careas.get(lastIndex); 但是,它确实涉及indexOf在每个元素上使用on,这通常是您通常不希望的,因为它会影响性能。
117 java  list  java-8  java-stream 

1
Java 8默认方法作为特征:安全吗?
使用默认方法作为 Java 8中穷人的特性版本,是安全的做法吗? 有人声称,如果只是为了大熊猫而使用它们,可能会使大熊猫感到难过,因为它很酷,但这不是我的意图。还经常提醒我们,引入了默认方法来支持API的演进和向后兼容性,这是对的,但这并没有错误或扭曲地将其用作特征。 我想到了以下实际用例: public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } 或者,也许定义一个PeriodTrait: public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } 诚然,可以使用组合(甚至辅助类),但是它看起来比较冗长和混乱,并且不能从多态中受益。 因此,可以将默认方法用作基本特征,还是我应该担心无法预料的副作用? 关于SO的几个问题与Java vs Scala特性有关。这不是重点。我也不只是在征求意见。相反,我正在寻找一个权威的答案或至少是对领域的洞察力:如果您在公司项目中使用默认方法作为特质,那是否真是定时炸弹?

4
如何使用新的computeIfAbsent函数?
我非常想使用Map.computeIfAbsent,但是自从lambdas进入本科以来已经太久了。 几乎直接来自文档:它给出了做事的旧方法的示例: Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>(); String key = "snoop"; if (whoLetDogsOut.get(key) == null) { Boolean isLetOut = tryToLetOut(key); if (isLetOut != null) map.putIfAbsent(key, isLetOut); } 和新方法: map.computeIfAbsent(key, k -> new Value(f(k))); 但在他们的示例中,我认为我不太“了解”。我将如何转换代码以使用新的lambda表达方式?

6
如何使用Lambda表达式调试stream()。map(...)?
在我们的项目中,我们正在迁移到Java 8,并且正在测试它的新功能。 在我的项目中,我使用Guava谓词和函数使用Collections2.transform和过滤和转换某些集合Collections2.filter。 在此迁移中,我需要将番石榴代码更改为java 8更改。因此,我正在做的更改是: List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13); Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){ @Override public Integer apply(Integer n) { return n * 2; } }; Collection result = Collections2.transform(naturals, duplicate); 至... List<Integer> result2 = naturals.stream() .map(n -> n * 2) .collect(Collectors.toList()); 使用番石榴,我可以很轻松地调试代码,因为我可以调试每个转换过程,但是我关心的是例如如何调试 .map(n -> n*2)。 使用调试器,我可以看到一些类似的代码: …
114 java  debugging  lambda  java-8 

2
Lambda表达式与方法参考[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 IntelliJ一直建议我用方法引用替换我的lambda表达式。 两者之间有客观差异吗?

11
从Lambda内部修改局部变量
修改中的局部变量forEach会产生编译错误: 正常 int ordinal = 0; for (Example s : list) { s.setOrdinal(ordinal); ordinal++; } 与Lambda int ordinal = 0; list.forEach(s -> { s.setOrdinal(ordinal); ordinal++; }); 任何想法如何解决这个问题?
114 java  lambda  java-8 

4
Java三元运算符与<JDK8兼容性中的if / else
最近,我正在阅读Spring Framework的源代码。我不明白的地方在这里: public Member getMember() { // NOTE: no ternary expression to retain JDK &lt;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 …

7
Java 8:java.util.function中的TriFunction(和亲属)在哪里?还是有什么选择?
我看到了java.util.function.BiFunction,所以我可以这样做: BiFunction&lt;Integer, Integer, Integer&gt; f = (x, y) -&gt; { return 0; }; 如果那还不够好并且我需要TriFunction怎么办?它不存在! TriFunction&lt;Integer, Integer, Integer, Integer&gt; f = (x, y, z) -&gt; { return 0; }; 我想我应该补充一点,我知道我可以定义自己的TriFunction,我只是想了解不将其包含在标准库中的原因。
113 java  lambda  java-8 

12
Spring Boot中的JSON Java 8 LocalDateTime格式
我在Spring Boot应用程序中格式化Java 8 LocalDateTime时遇到一个小问题。对于“正常”日期,我没有问题,但是LocalDateTime字段转换为以下内容: "startDate" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { "id" : "ISO", "calendarType" : "iso8601" } } 虽然我想将其转换为: "startDate": …


2
Comparator.reversed()不使用lambda进行编译
我有一个包含一些User对象的列表,我正在尝试对列表进行排序,但是只能使用方法引用来工作,对于lambda表达式,编译器会给出错误: List&lt;User&gt; userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -&gt; u.getName())); // works userList.sort(Comparator.comparing(User::getName).reversed()); // works userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); // Compiler error 错误: com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); ^ symbol: method getName() location: variable u of type Object 1 error

7
Java8 Lambdas与匿名类
自从Java8最近发布以来,它的全新lambda表达式看起来真的很酷,我想知道这是否意味着我们曾经习惯的Anonymous类的消亡。 我对此进行了一些研究,发现了一些很酷的示例,这些示例说明Lambda表达式将如何系统地替换这些类,例如Collection的sort方法,该方法用于获取Comparator的Anonymous实例来执行排序: Collections.sort(personList, new Comparator&lt;Person&gt;(){ public int compare(Person p1, Person p2){ return p1.firstName.compareTo(p2.firstName); } }); 现在可以使用Lambdas完成: Collections.sort(personList, (Person p1, Person p2) -&gt; p1.firstName.compareTo(p2.firstName)); 而且看起来简明扼要。所以我的问题是,是否有任何理由继续在Java8中使用这些类而不是Lambda? 编辑 同样的问题,但方向相反,使用Lambdas代替Anonymous类有什么好处,因为Lambdas只能与单个方法接口一起使用,此新功能仅是仅在少数情况下使用的快捷方式,还是真的有用吗?

4
Lambda表达式和通用方法
假设我有一个通用接口: interface MyComparable&lt;T extends Comparable&lt;T&gt;&gt; { public int compare(T obj1, T obj2); } 和方法sort: public static &lt;T extends Comparable&lt;T&gt;&gt; void sort(List&lt;T&gt; list, MyComparable&lt;T&gt; comp) { // sort the list } 我可以调用此方法并将lambda表达式作为参数传递: List&lt;String&gt; list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -&gt; a.compareTo(b)); 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: interface MyComparable { public &lt;T extends …
111 java  generics  lambda  java-8 

3
为什么在Java 8中split有时会在结果数组的开头删除空字符串?
在Java 8之前,当我们分割空字符串时 String[] tokens = "abc".split(""); 拆分机制将在标有的位置拆分 | |a|b|c| 因为""每个字符前后都有空白。因此,结果将首先生成此数组 ["", "a", "b", "c", ""] 稍后将删除结尾的空字符串(因为我们没有为limit参数明确提供负值),因此它将最终返回 ["", "a", "b", "c"] 在Java 8中,拆分机制似乎已更改。现在当我们使用 "abc".split("") 我们将得到["a", "b", "c"]数组而不是数组,["", "a", "b", "c"]因此看起来开始时的空字符串也被删除了。但是这个理论失败了,因为 "abc".split("a") 在start处返回带有空字符串的数组["", "bc"]。 有人可以解释一下这是怎么回事,以及拆分规则在Java 8中是如何变化的吗?
110 java  regex  split  java-8 

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.