问题:考虑以下浮点数[]:
d[i] = 1.7 -0.3 2.1 0.5
Run Code Online (Sandbox Code Playgroud)
我想要的是一个int []数组,它表示带索引的原始数组的顺序.
s[i] = 1 3 0 2
d[s[i]] = -0.3 0.5 1.7 2.1
Run Code Online (Sandbox Code Playgroud)
当然,可以使用自定义比较器,自定义对象的排序集,或者通过简单地对数组进行排序,然后搜索原始数组中的索引(颤抖)来完成.
我实际上正在寻找的是Matlab的sort函数的第二个返回参数的等价物.
有没有一种简单的方法(<5 LOC)?可能有一个解决方案,不需要为每个元素分配一个新对象?
更新:
谢谢你的回复.不幸的是,迄今为止提出的所有内容都不像我希望的简单而有效的解决方案.因此,我在JDK反馈论坛中打开了一个帖子,建议添加一个新的类库函数来解决这个问题.让我们看看Sun/Oracle对此问题的看法.
http://forums.java.net/jive/thread.jspa?threadID=62657&tstart=0
我使用java.nio库中的Files.walk()方法在Java 8中生成了一个Stream.问题是该方法默认包括根路径,但我不想要这个元素.在这种情况下,我使用filter()方法解决了这个代码:
public void listFiles(String directoryPath) {
try {
Path root = Paths.get(directoryPath);
Files.walk(root,1)
.filter(x -> !x.equals(root))
.forEach(System.out::println);
} catch (IOException ex) {
System.err.println("Error reading file: " + directoryPath);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果有一种更优雅的方法来删除Stream的第一个元素而不是这个.例如,使用Stream中的索引或使用tail()方法作为其他函数语言.
java functional-programming filter java.nio.file java-stream
Stream继承一个iterator()方法来生成一个Iterator.
例如,给定这个字符串:
String input = "this\n" +
"that\n" +
"the_other";
Run Code Online (Sandbox Code Playgroud)
...我需要将字符串的这些部分作为 anIterable传递给特定的库。调用input.lines()产生一个Stream. 所以如果我能把它Stream变成Iterable它的一个元素,我会很高兴的。
可以说我有两个类和两个方法:
class Scratch {
private class A{}
private class B extends A{}
public Optional<A> getItems(List<String> items){
return items.stream()
.map(s -> new B())
.findFirst();
}
public Optional<A> getItems2(List<String> items){
return Optional.of(
items.stream()
.map(s -> new B())
.findFirst()
.get()
);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么getItems2编译时getItems会出现编译器错误
incompatible types: java.util.Optional<Scratch.B> cannot be converted to java.util.Optional<Scratch.A>
Run Code Online (Sandbox Code Playgroud)
所以,当我返回get的值和使用编译器再次包装它时,会识别继承,但如果我直接使用结果,则不会.OptionalfindFirstOptional.offindFirst
我有两个结构如下的类:
public class Company {
private List<Person> person;
...
public List<Person> getPerson() {
return person;
}
...
}
public class Person {
private String tag;
...
public String getTag() {
return tag;
}
...
}
Run Code Online (Sandbox Code Playgroud)
基本上,Company类有一个Person对象列表,每个Person对象都可以获得Tag值.
如果我得到Person对象的List,有没有办法使用来自Java 8的Stream来找到所有Person对象中最常见的一个Tag值(如果是平局,可能只是最随机的一个)共同)?
String mostCommonTag;
if(!company.getPerson().isEmpty) {
mostCommonTag = company.getPerson().stream() //How to do this in Stream?
}
Run Code Online (Sandbox Code Playgroud) 我想循环一个庞大的数组并做一组复杂的指令需要很长时间.但是,如果超过30秒,我希望它放弃.
恩.
final long start = System.currentTimeMillis();
myDataStructure.stream()
.while(() -> System.currentTimeMillis() <= start + 30000)
.forEach(e ->
{
...
});
Run Code Online (Sandbox Code Playgroud)
如果满足某个条件,我想避免return在forEach通话中说话.
对于Collectors.groupingBy()那个返回Map<K,List<T>>,它暗示List<T>是为了评估流?
我没有看到列表排序的明确描述,而并发版本明确表示没有排序.如果它没有以某种方式订购,我会期望它是一个收藏品,我不会看到除了收到订单之外的其他订单.
我希望保证每个列表中的最后一个值是该组收到的最后一个值.
我想获取输入并在其上应用并行流,然后我想输出为列表.输入可以是我们可以应用流的任何列表或任何集合.
我担心的是,如果我们想要输出作为映射它们,我们有一个来自java的选项就像
list.parallelStream().collect(Collectors.toConcurrentMap(args))
Run Code Online (Sandbox Code Playgroud)
但是我没有选择以线程安全的方式从并行流中收集以提供列表作为输出.我看到另外一个选项可供使用
list.parallelStream().collect(Collectors.toCollection(<Concurrent Implementation>))
通过这种方式,我们可以在collect方法中提供各种并发实现.但我认为java.util.concurrent中只存在CopyOnWriteArrayList List实现.我们可以在这里使用各种队列实现,但那些不会像列表一样.我的意思是我们可以解决这个问题.
如果我想要输出列表,你能指导一下最好的方法吗?
注意:我找不到与此相关的任何其他帖子,任何参考都会有所帮助.
在我的项目中,我使用的是受欢迎的图书馆retrolambda.我刚刚下载了新的Android Studio 3.0 Canary 1.
我已经更新了我的项目以使用Gradle等新版本.一切都很好.
Android Studio 3中的新功能是为了支持某些Java8功能而构建的.新的AS3建议删除retrolambda并使用这些功能.
我删除了retrolambda,Gradle构建成功但是应用程序崩溃了这个错误(在有lambda的地方)
E/UncaughtException: java.lang.NoSuchMethodError: No static method lambda$replace$2
Run Code Online (Sandbox Code Playgroud)
我在我的项目中使用RxJava2.我不确定这与它有关,但在我看来,Java8的内置功能看起来不起作用.也许我需要在"某个地方"设置一些东西?
我的Gradle文件
根项目
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-alpha1'
classpath 'com.google.gms:google-services:3.0.0'
//classpath 'me.tatarka:gradle-retrolambda:3.6.1'
}
Run Code Online (Sandbox Code Playgroud)
应用模块
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
repositories {
mavenCentral()
maven { url "https://jitpack.io" }
}
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'
...
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.firebase:firebase-analytics:9.8.+'
compile 'com.google.firebase:firebase-crash:9.8.+'
compile 'com.google.android.gms:play-services-maps:9.8.+'
compile 'com.google.android.gms:play-services-analytics:9.8.+'
compile 'com.google.android.gms:play-services-auth:9.8.+'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
//Support Library
(...)
compile …Run Code Online (Sandbox Code Playgroud) 在进行流操作时,在中间/ pleleline操作期间,将创建具有不同特征的流(例如,SORTED/SIZED/DISTINCT/ORDERED) - 掌握Lambdas(第6章)
Stream.of(8,3,5,6,7,4)//ORDERED, SIZED
.filer(i->i%2==0) // ORDERED
.sorted() // ORDERED, SORTED
.distinct() // DISTINCT, ORDERED, SORTED
.map(i->i+1) // ORDERED
.unordered(); //none
Run Code Online (Sandbox Code Playgroud)
我们如何找出上面代码段中提到的流的不同特征?
java ×9
java-stream ×8
java-8 ×5
android ×1
arrays ×1
collectors ×1
filter ×1
iterable ×1
list ×1
optional ×1
retrolambda ×1
sorting ×1