在以下代码段中:
public class IDMapBase<T> extends HashMap<DeviceID, T> {
public Map<DeviceID, T> filterMap(Set<DeviceID> neededIDs) {
return entrySet().stream()
.filter(e -> neededIDs.contains(e.getKey()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
}
Run Code Online (Sandbox Code Playgroud)
为什么简单地说Entry::getXX而不是Entry<DeviceID, T>>::getXX?我认为这(Map.)Entry将默认为Entry<Object, Object>,它不能用作a的条目Map<DeviceID, T>.
我正在尝试SELECT MAX(COUNT DISTINCT field_x) FROM stream GROUP BY field_y;使用Java Streams/Collectors在一个groovy脚本中做一个.基本上,我想要一个解决方案COUNT DISTINCT,我可以接受.max.
我一直在尝试这篇文章中的解决方案:java 8 - stream,map和count distinct
但得到错误:
unexpected token: : @ line 65, column 114.
")}, Collectors.toSet()), Set::size).val
Run Code Online (Sandbox Code Playgroud)
Groovy中似乎有一个问题Set::size和Map::size.
我已经导入都java.util.Map和java.util.Set无济于事.这是Groovy语法/导入Java类的问题还是我正在使用的问题Collectors?作为参考,我只是尝试在原始后期解决方案中在此地图上实现forEach println:
Map<Integer, Integer> map = bids.stream().collect(
groupingBy(
Bid::getBidderUserId,
collectingAndThen(
mapping(Bid::getAuctionId, toSet()),
Set::size)));
Run Code Online (Sandbox Code Playgroud)
如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.
BigDecimal getInterest(List<Investment> investments) {
BigDecimal interest = BigDecimal.ZERO;
for (Investment i: investments) {
i.getTransactions().stream()
.map(Transaction::getAmount)
.forEach(interest::add);
}
return interest;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是它总是返回零.看起来好像 .forEach()没有消耗它的论点.但是如果我按照下面的方式编写它,一切都运行正常.任何人都知道为什么第一种方法不起作用?
BigDecimal getInterest(List<Investment> investments) {
BigDecimal interest = BigDecimal.ZERO;
for (Investment i: investments) {
interestPaid = interest.add(i.getTransactions().stream()
.map(Transaction::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add));
}
return interest;
}
Run Code Online (Sandbox Code Playgroud) 我有如下方法
private Map<String,List<String>> createTableColumnListMap(List<Map<String,String>> nqColumnMapList){
Map<String, List<String>> targetTableColumnListMap =
nqColumnMapList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
return targetTableColumnListMap;
}
Run Code Online (Sandbox Code Playgroud)
我想大写地图键,但找不到一种方法。有没有Java 8的方法来实现这一目标?
这个问题只是为了好玩.
我有这个方法:
private static String getBaseDomain(String fullDomain) {
// we take the base domain from the usual xxx.yyy.basedomain.tld: we
// want only the last 2 elements: basedomain.tld
List<String> elements = Arrays.asList(fullDomain.split("\\."));
if( elements.size() > 2){
elements = elements.subList(elements.size()-2, elements.size());
}
return String.join(".", elements);
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用java流API获得相同的结果(实际上,我想知道哪种方法是最节省资源的).
我无法想象如何仅从流中获取最后2个元素:limit(2)将给出前两个元素,并且skip(XXX)我不知道如何提取流"inline"的大小.
你能告诉我你会怎么做吗?
我是Stream API的新手,我正在寻找更优雅和最短的方法来使用相当于此代码的Stream API 来填充具有相同对象的ArrayList :
SomeObject someObject = new SomeObject();
List<SomeObject> someObjectList = new ArrayList<>();
int maxLimitValue = 70; //for example
for(int i=0; i<=maxLimitValue; i++){
someObjectList.add(someObject);
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了许多不同的解决方案来完成当前的任
这个变体几乎就是我想要的,但是有一个对象的自动生成,但我需要使用一次创建的相同对象.
这个解决方案也几乎是我需要的,但我不确定这个对象的复制,返回的List类型不是 ArrayList(它返回了CopiesList类型,在将来的操作中无法添加到ArrayList).
ps也许它可能重复,但我真的找不到使用Stream API执行此操作的正确和简短的方法.
更新(assylias添加):
是的,我同意你的观点:
List<SomeObject> list = Collections.nCopies(70, someObject);
Run Code Online (Sandbox Code Playgroud)
但是,当我打开这个方法时:
public static <T> List<T> nCopies(int n, T o) {
if (n < 0)
throw new IllegalArgumentException("List length = " + n);
return new CopiesList<>(n, o);
}
Run Code Online (Sandbox Code Playgroud)
正如我们所见 - 它返回CopiesList对象,而不是ArrayList.另外,作为其他列表,它正在扩展AbstractList:
private static class CopiesList<E>
extends …Run Code Online (Sandbox Code Playgroud) 是否有一种方便的Java8流API方式从List<T> to Map<T, (index)>以下示例进行转换:
List<Character> charList = "ABCDE".chars().mapToObj(e->(char)e).collect(Collectors.toList());
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < charList.size(); i++) {
map.put(charList.get(i), i);
}
Run Code Online (Sandbox Code Playgroud)
映射= {A = 0,B = 1,C = 2,D = 3,E = 4}
我正在编写一个从CSV文件中获取数据的Java程序.对于每一行数据,我需要使用相应的标题作为键将每个数据元素放入映射中.例如,headerRow [7]和dataElements [7]应该是地图中的键值对.
下面是我传统上使用Java编写的代码:
private Map<String, Double> readLine(String[] headerRow, String[] dataElements) {
Map<String, Double> headerToDataMap = new HashMap<>();
for (int i=0; i < nextLine.length; i++) {
headerToDataMap.put(headerRow[i], Double.valueOf(dataElements[i]));
}
return headerToDataMap;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用Java 8流编写这段代码 - 请记住我是在同时迭代两个数组?
我正在尝试按产品类别对Product类的对象列表进行分组。不幸的是,Product类的编写方式是这样的:
class Product {
Map<String, String> property;
}
Run Code Online (Sandbox Code Playgroud)
产品类包含一个属性映射,这些属性之一称为“ ProductType”。例如,地图可以包含:
ProductType : Machine
Price : 1000
Name : Motor Cutter
......
Run Code Online (Sandbox Code Playgroud)
我们有一个产品清单。我在想用ProductType将它们分组为Map<String, List<Product>>使用Java 8的流和lamda表达式的正确方法是什么。
如果将Product类定义为:答案是显而易见的。
class Product {
String ProductType;
Double Price;
String Name;
}
Run Code Online (Sandbox Code Playgroud)
但是有了我们最上面的定义,我不知道如何实现这一点。
有人可以帮忙吗?
我使用一个简单的reduce方法,有三个参数即.身份,累加器和组合器.这是我的代码......
Integer ageSumComb = persons
.stream()
.reduce(0,
(sum, p) -> {
System.out.println("Accumulator: Sum= "+ sum + " Person= " + p);
return sum += p.age;
},
(sum1, sum2) -> {
System.out.format("Combiner: Sum1= " + sum1 + " Sum2= "+ sum2);
return sum1 + sum2;
Run Code Online (Sandbox Code Playgroud)
但正在发生的事情是Combiner没有被执行.我没有得到这背后的原因.这是我的输出..
Accumulator: Sum= 0 Person= Max
Accumulator: Sum= 18 Person= Peter
Accumulator: Sum= 41 Person= Pamela
Accumulator: Sum= 64 Person= David
Accumulator: Sum= 76 Person= Pam
Run Code Online (Sandbox Code Playgroud)
但是,没有编译错误,没有异常,我的输出完全正确,与我的预期相同.但是没有得到为什么组合器没有执行.
java-stream ×10
java ×9
java-8 ×8
lambda ×2
arraylist ×1
arrays ×1
collections ×1
collectors ×1
combiners ×1
groovy ×1
hashmap ×1
reduce ×1
split ×1
string ×1