Tag: java 8

Android的 – 是否可以使用Comparator.comparing排序列表,而不是在API <24的自定义比较器?

我在我正在工作的应用程序中有一个RecyclerView,我可以填充各种项目和搜索/筛选/排序/依此类推。 目前正在分拣。 我有多个标准可以排序,可以从下拉菜单中选择。 在数据对象中排序的值包括字符串,整数和枚举,所有这些都很容易分类。 然而,尽管一些分类选项只需要一个标准,但是一些需要二级或三级标准(并且在一些非常罕见的情况下高达4个)。 为了有效地使用Collections.sort(List, Comparator) ,我需要编写相当多的自定义比较器,所以我希望有一些方法可以避免这种情况。 原来,Java 8有一个很好的解决方案: Comparator.comparing(…) ,它为您生成比较器,并可以通过Comparator.comparing().thenComparing().thenComparing()…无限地轻松扩展。 它也有List myList.sort() ,我不知道与Collections.sort(myList)相比的效率,但它感觉更清洁。 我看着它, 只是想我的运气! Android已经支持了很多Java 8function,现在已经有一段时间了! 不幸的是,Android Studio告诉我,出于某种原因, Comparator.comparing()以及List::sort只在API 24及更高版本上受支持。 这对我来说并不现实,因为我正在开发的应用程序“需要”的运行速度与API 15-16一样低。 但是,我发现这很奇怪,因为我试过的其他Java 8特性(lambdaexpression式类似于(o1, o2) -> (o1.toString().compareTo(o2.toString())和方法引用(如List::sort上面的List::sort )在我检查的范围内的所有API级别上都可以正常工作,只要您指定了针对Java 8的目标即可。而这毕竟是Java 8的事情,而不是Android的事情。 所以记住,有没有办法使Comparator.comparing()和List::sort工作在API 24之下? 我在Google搜索中没有发现任何东西,它们最终都只是指向Android的Java 8“文档”或比较器和列表的JavaDocs。 要么是Android的支持库中的东西(似乎不太可能)或像Retrolambda这样的第三方库/黑客?

什么Java 8 Stream.collect等价物在标准Kotlin库中可用?

在Java 8中,有Stream.collect ,它允许在集合上进行聚合。 在Kotlin中,这不是以同样的方式存在,除了可能作为stdlib中扩展函数的集合。 但是不清楚不同用例的等价关系是什么。 例如, JavaDoc for Collectors的顶部是为Java 8编写的示例,将它们移植到Kolin时,不能在不同的JDK版本上使用Java 8类,因此可能应该使用不同的方式编写。 就在线资源展示Kotlin集合的例子而言,它们通常是微不足道的,并没有真正与相同的用例相比较。 什么是真正符合Java 8 Stream.collect记录的案例的好例子? 这里的列表是: 将名字积累到列表中 将名称累加到TreeSet中 将元素转换为字符串并连接它们,用逗号分隔 计算员工的工资总额 按部门分组员工 按部门计算工资总额 将学生划分为通过和失败 上面链接了JavaDoc中的细节。 注意: 这个问题是由作者故意写的和回答的( 自我回答的问题 ),所以对于常见的Kotlin话题的习惯性的回答是在SO中。 此外,为了澄清一些真正的古老的答案写为科特林的阿尔法,是不是今天的Kotlin准确。

与Java SAM没有2.12 M2标志的Scala互操作

有没有使用Java @FunctionalInterface / SAM / lambdaexpression式的Java-8 API编写Scala代码的公认技巧? 虽然Java lambdaexpression式inter-op在M2 http://www.scala-lang.org/news/2.12.0-M2中的一个标志下是可用的,但我更希望类/ AnyVal解决方案可能与scala一起工作functionX特点。 不幸的是,scala.FunctionX扩展AnyRef而不是Any,所以不能使用/混合这些特性到隐式的AnyVal类实现中。 补充:我不完全确定,即使scala.FunctionX是全球特征(从任何延伸)我如何实现我的目标。 我的用例是这样的: 在我的一个项目中,我选择了像Java Stream接口和类一样提供一个带有FunctionalInterfaces的Java-8 API,以便迎合尽可能广泛的基于JVM的客户端语言,例如Closure,Scala和Kotlin。 对于使用我的Java-8 API的每种客户端语言,如果在访问Java-8 API时,我将编写适当的绑定(如果需要的话)以使用特定于语言的习惯用法。 顺便说一句。 我也会对在Kotlin-Java互操作环境中提出的这个问题的任何评论感兴趣。

是否有任何相当于Java 8 Stream限制function的Kotlin函数?

我试图find符合条件(过滤)的列表中的前两个元素,为此,我已经在kotlin中实现了以下代码片段: val arr = 0 until 20 val res = arr.filter { i -> println(“Filter: $i”) i % 2 == 0 }.take(2) 一切都很好,直到我意识到它通过整个清单过滤,无论是否find了这两个元素。 利用Java 8流API,它按预期工作。 val res2 = arr.toList().stream() .filter { i -> println(“Filter: $i”) i % 2 == 0 }.limit(2) 所以我的问题是,如果只能使用Kotlin函数来实现。 我知道我可以使用一个简单的循环,但我想使用一个函数式编程aproach。

Java 8中“function接口”的精确定义

最近我开始研究Java 8,我不能完全理解Java实现lambdaexpression式所必需的“function接口”的概念。 在Java中有一个非常全面的 lambda函数的指南 ,但是我陷入了定义函数接口概念的章节 。 定义如下: 更确切地说,一个function接口被定义为只有一个抽象方法的任何接口。 然后他继续举例,其中一个是Comparator接口: public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); } 我能够测试,我可以使用lambda函数来代替Comparator参数,它的工作原理(即Collections.sort(list, (a, b) -> ab) )。 但是在Comparator接口中, compare和equals方法都是抽象的,这意味着它有两个抽象方法 。 那么如果定义需要一个接口只有一个抽象方法 ,那么这怎么可能呢? 我在这里错过了什么?

Kotlin:Java 8的哪些function尚未支持?

是否有关于Java 8function的最新概述,这些function在Kotlin中尚不受支持? 例如,调用像Map#putIfAbsent这样的默认方法无法编译(不支持的引用错误): import java.util.* fun main(args: Array) { val x : Map = HashMap() x.putIfAbsent(1, 2) } 如果默认方法被覆盖,它将起作用: import java.util.* fun main(args: Array) { val x : HashMap = HashMap() x.putIfAbsent(1, 2) } 这就是我通过实验发现的结果,但是对于决定是否已经可以从Java 8代码迁移到Kotlin,系统性的概述将是有价值的。 更新:我的例子中的代码是由“Java to Kotlin”转换器创建的。 正如user2235698指出的那样, Map是一个不可变的Kotlin映射。 不过,当我将其更改为java.util.Map映射时,该示例无法编译。 然而,我声称它必须用默认的方法做一些事情,这是误导性的。 由于它超出了这个问题的范围,所以我在这里打开了一个后续问题: java.util.HashMap是否不在Kotlin中实现java.util.Map?

Java将特定类的列表添加到java.lang.Object列表中,与java 8 streams一起工作 – 为什么?

public class Test { static List<Object> listA = new ArrayList<>(); public static void main(final String[] args) { final List<TestClass> listB = new ArrayList<>(); listB.add(new TestClass()); // not working setListA(listB); // working setListA(listB.stream().collect(Collectors.toList())); System.out.println(); } private static void setListA(final List<Object> list) { listA = list; } } 为什么它与流一起工作,并不适用于简单的设置?

如何使用lambda表达式android替换匿名类

我们在android项目中使用了很多匿名类。 例如: new DialogInterface.OnClickListener() new MediaPlayer.OnPreparedListener() 等等有没有办法用新的Java lambda表达式来替换这些匿名类?

Android的工作室2.3总是挂出

我在Gradle 2.3.3使用Android Studio 2.3 。 我面对一个奇怪的问题,被困一个星期。 当我输入一些代码行时,它会很常挂起,在它显示auto complete框之前。 或者,如果我没有输入任何内容,而是使用Command-click来查找变量或方法的实现,则会显示对话框“ Resolving Reference并挂起。 有时候,如果我切换到另一个应用程序一段时间,并切换回查看Android Studio,它也挂起。 我已经尝试了许多不同的方法,但没有帮助,其中包括: 删除Android工作室完全按照这个答案,然后再下载并安装。 转到菜单File > Invalidate Cache/Restart… 删除JDK并重新安装。 我正在使用JDK jdk-8u131-macosx-x64从这里下载 删除所有生成文件夹和Rebuild Project 回滚到我过去成功构建的项目稳定的源代码。 尝试使用Android Studio 3.0 Preview 降级或升级Gradle Plugin 下载并用Android Studio替换JDK包遵循这个线程 以上所有方法都无助于保持Android Studio的稳定性。 我正在使用16Gb的RAM,核心i7, MacOS Sierra 10.12.5 Macbook,我不认为这个挂机是关于我的笔记本电脑的规格, 所以我在这里报告我的情况,并希望有人能帮助给我新的建议。 任何想法或建议表示赞赏。 更新 :我检查~/Library/Logs/Android Studio2.3/下的Android Studio的日志,并看到一些异常日志文件。 以下是最新的一个: 2017-07-04 19:14:35,633 [1233357] INFO – roid.sdk.MessageBuildingSdkLog – Exception […]

如何使用Java 7或更早版本实现Java 8 Stream API?

我在面试中被问及这个问题(微软)。 实施方法举例如下: (),.filter(),.map(),flatMap(),min(),count(),reduce(),groupBy() 等等 这是一个相当开放的问题,但我认为是一个有趣的问题。 谢谢