我正在寻找一种简洁有效的方法来从使用Java 8流的子项列表中获取唯一父项列表.
对于示例,我有两个简单的类:
public class Child{
private Parent parent;
public Child(Parent parent){
this.parent = parent;
}
public Parent getParent(){
return this.parent;
}
}
public class Parent{
private List<Child> children;
public Parent(){
this.children = new ArrayList<Child>();
}
public void addChild(Child child){
this.children.add(child);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我从某种方法获得Child对象的列表.
孩子可能属于多个父母,可能有父母碰撞.
List<Child> children = getChildren();
Run Code Online (Sandbox Code Playgroud)
然后 :
List<Parent> uniqueParents = children
.stream()
.collect(Collectors.groupingBy(Child::getParent))
.keySet()
.stream()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
所以它有效,但我想避免双流并收集.
这可能直接在一个流中吗?
我正在尝试用lambda制作一个过滤器.有一个字符串列表,其中包含应该排序的值,还有另一个列表,其中包含不同的值(即应该过滤的值).所以我一直想做的是:
stringList = stringList.stream()
.filter(e ->toBeSortedOutList.forEach(outSorted->!e.startsWith(outSorted)))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
不幸的是,我总是得到错误,布尔值无法转换为void.所以我想知道的是,为什么我得到这个错误,如果可以通过迭代通过列表并使用其值来过滤器进行过滤?谢谢你的回答!
在处理转换时(例如:transform List<People> peopleto List<Integer> ages,where People是包含属性的类age),通常有两种方法(对我而言):
使用java8:
people.stream().map(p -> p.getAge()).collect(toList());
或用户guava2:
Lists2.transform(people, People2AgeTransformer.INSTANCE);其中People2AgeTransformer是一个变换器,它实现了Function接口以返回年龄.
最近,我偶然发现java8和guava可以合并,因此代码可以是:
Lists2.transform(people, p->p.getAge());
Run Code Online (Sandbox Code Playgroud)
这段代码符合并运行没有任何错误,这让我感到困惑.该方法Lists2.transform()要求第二个args是接口的实现com.google.common.base.Function,而java8 lambda实际上是接口的实现java.util.function.Function.(好吧,它们都声明了一个B apply(A input)将A转换为B 的方法.)
我不明白为什么这会起作用,因为它们是不同包的两个不同界面.
有没有办法使用一些谓词和java流过滤内部和外部列表?例如:
Class outerObject{
int num;
List<innerObject> innerObjectList;
}
Class innerObject{
int num;
}
List <outerObject> outerObjectList
Run Code Online (Sandbox Code Playgroud)
有没有办法过滤列表,使outerObject列表有字段num = 10,相应字段的innerObject's 列表outerObject也被相应的字段过滤num = 10?
我试过了:
outerObjectList.stream()
.filter(i -> i.getNum() == 10)
.filter(i -> i.getOrders().stream().anyMatch(s -> getNum() == 10))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但它似乎没有过滤内部列表.
描述性示例:
如果外部列表中有3个对象,num = 10并且3个对象中的每个对象都有1个内部对象innerObjectList,num = 10那么它应该给我一个3 outerObject的列表,innerObject每个列表为1 .
我ArrayList在Java中有一个简单的问题.
我有一个简单的ArrayList.现在我要检查,如果ArrayList包含某个字符串.我知道contains()将对象作为一个整体进行检查,但我想检查对象的一部分是否具有我正在寻找的字符串.
那么实现这一目标的最佳方法是什么?我的样本在这里说False,我希望它说True.怎么样?
ArrayList<String> test_al = new ArrayList();
test_al.add("hello world");
if(test_al.contains("hello")){
Log.v(LOG_TAG,"True");
}
else{
Log.v(LOG_TAG,"False");
}
Run Code Online (Sandbox Code Playgroud) 我有一群List以薪水为特征的员工。为什么这段代码不起作用?
String joined = employees.stream().collect(
Collectors.summingInt(Employee::getSalary),
Collectors.maxBy(Comparator.comparing(Employee::getSalary)),
Collectors.minBy(Comparator.comparing(Employee::getSalary)),
Collectors.averagingLong((Employee e) ->e.getSalary() * 2),
Collectors.counting(),
Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)
我正在使用一套收集器。
我有一个自定义类PDFDataItem,提供getValue()方法,该方法返回一个double值(请参阅附加的代码).我还有一个包含多个PDFDataItem实例的ArrayList,每个实例都有一个特定的值:不同的实例可以具有相同的值.我想要做的是创建一个LinkedHashMap,其中单独存储实例的值,并且对于找到的每个值,存储的数量(即它比较的实例的数量).当然,我可以找到许多技巧来实现我的目标,但我想知道是否存在快速方法(可能使用lambda).
public class PDFDataItem{
double value;
public PDFDataItem(double value){
this.value = value;
}
public double getValue(){
return value;
}
}
Run Code Online (Sandbox Code Playgroud) import java.util.ArrayList;
import java.util.List;
public class IterationBenchmark {
public static void main(String args[]){
List<String> persons = new ArrayList<String>();
persons.add("AAA");
persons.add("BBB");
persons.add("CCC");
persons.add("DDD");
long timeMillis = System.currentTimeMillis();
for(String person : persons)
System.out.println(person);
System.out.println("Time taken for legacy for loop : "+
(System.currentTimeMillis() - timeMillis));
timeMillis = System.currentTimeMillis();
persons.stream().forEach(System.out::println);
System.out.println("Time taken for sequence stream : "+
(System.currentTimeMillis() - timeMillis));
timeMillis = System.currentTimeMillis();
persons.parallelStream().forEach(System.out::println);
System.out.println("Time taken for parallel stream : "+
(System.currentTimeMillis() - timeMillis));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
AAA
BBB
CCC
DDD
Time taken for …Run Code Online (Sandbox Code Playgroud) 我目前正在官方的Oracle网站上学习java,我复制粘贴下面的代码.代码没有任何问题,但问题是我不知道如何使用它.假设它是一种计算数组中元素数量T[]大于指定元素elem的方法.有人可以告诉我一个如何使用这种方法的例子吗?
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
int count = 0;
for (T e : anArray) {
if (e.compareTo(elem) > 0) {
++count;
}
}
return count;
}
public interface Comparable<T> {
public int compareTo(T o);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将java7程序转换为java8。我想在下面使用流API进行输出。
public List<String> getTopThreeWeatherCondition7() {
List<String> _Top3WeatherList = new ArrayList<String>();
Map<String, Integer> _WeatherCondMap = getWeatherCondition7();
List<Integer> _WeatherCondList = new ArrayList<Integer>(_WeatherCondMap.values());
Collections.sort(_WeatherCondList, Collections.reverseOrder());
List<Integer> _TopThreeWeathersList = _WeatherCondList.subList(0, 3);
Set<String> _WeatherCondSet = _WeatherCondMap.keySet();
Integer count = 0;
for (String _WeatherCond : _WeatherCondSet) {
count = _WeatherCondMap.get(_WeatherCond);
for (Integer _TopThreeWeather : _TopThreeWeathersList) {
if (_TopThreeWeather == count) {
_Top3WeatherList.add(_WeatherCond);
}
}
}
_WeatherCondList = null;
_WeatherCondMap = null;
_TopThreeWeathersList = null;
_WeatherCondSet = null;
return _Top3WeatherList;
}
Run Code Online (Sandbox Code Playgroud) java ×10
java-stream ×8
java-8 ×6
lambda ×2
android ×1
arraylist ×1
arrays ×1
collections ×1
collectors ×1
for-loop ×1
generics ×1
guava ×1
list ×1
methods ×1
performance ×1