有没有更好的方法来计算地图中所有列表的大小?那么firstList.size() + secondList.size()?我已经这样做了,但创建一个仅用于计数的列表并不是正确的方法..
public static void main(String[] args) {
List<String> firstList = new ArrayList<>();
firstList.add("first");
List<String> secondList = new ArrayList<>();
secondList.add("second");
Map<String, List<String>> myMap = new HashMap<>();
myMap.put("one", firstList);
myMap.put("two", secondList);
int size = myMap.entrySet().stream()
.map(entry -> entry.getValue())
.flatMap(list -> list.stream())
.collect(Collectors.toList())
.size();
System.out.println("Size of all elements in map is:" + size);
}
Run Code Online (Sandbox Code Playgroud) 我不能在不使用:: notation的情况下创建供应商.所有教程似乎都在使用::来获取方法.
Function<String, Object> beanFactory = m_context::getBean;
Function<Void, IRCPublic> ircPublicSupplier = a -> (IRCPublic) beanFactory.apply("developerPublicConnection");
ircPublicSupplier.apply(null);
Run Code Online (Sandbox Code Playgroud)
我如何将第2行转换为单行语句来创建供应商,并且只需使用'.get()'.我可以使用'.apply(null)',但这看起来很脏.
谢谢!
假设我有一个
List<int[]> input = ( {1,2,3}, {1,2,4},
{1,2,7}, {1,3,1}, {2,2},
{1,2,8}, {1,3,4}, {2,3})
Run Code Online (Sandbox Code Playgroud)
我需要把它转换成
Map<int[] , int[]> result = { [{1,2} -> {3,4,7,8}] ,
[{1,3} -> {1,4}] ,
[{2} -> {2,3}] }
Run Code Online (Sandbox Code Playgroud)
有效地,映射的关键是常见值,直到数组长度为2,值应包含所有这些数组的最后一个元素.
有人可以建议我如何使用java流来获取它,因为在正常的循环中,所有这些都是非常复杂的事情吗?
我有一个看起来像这样的结构:
Map<Long, List<Double>
Run Code Online (Sandbox Code Playgroud)
我想把它转换成
List<Double>
Run Code Online (Sandbox Code Playgroud)
此结果列表中的每个项目表示一个键的值的总和.使用示例Map:
{1: [2.0, 3.0, 4.0],
2: [1.5, 10.0]}
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
[9.0, 11.5]
Run Code Online (Sandbox Code Playgroud)
要么
[11.5, 9.0]
Run Code Online (Sandbox Code Playgroud)
(顺序无所谓).是否可以使用Java 8 merge()方法?实际上上面的情况有点简化,因为事实上我的List是用一些复杂的类进行参数化的,我想创建这个类的合并对象,但我只想在这里掌握一般的想法.
下面的代码转换字符串列表,其中键和值由"."分隔.输入Map<String, java.util.List<String>>
public static void main(String args[]) {
java.util.List<String> l = new java.util.ArrayList<String>();
l.add("key1.value1");
l.add("key1.value2");
l.add("key2.value3");
java.util.Map<String, java.util.List<String>> map = new java.util.HashMap<String, java.util.List<String>>();
l.forEach(line -> {
String[] sa = line.split("\\.");
List<String> ls = map.get(sa[0]);
if (ls == null) {
List<String> initial = new ArrayList<String>();
initial.add(sa[1]);
map.put(sa[0], initial);
} else {
ls.add(sa[1]);
}
});
for (Entry<String, List<String>> entry : map.entrySet()) {
String key = entry.getKey();
List<String> value = entry.getValue();
System.out.println(key+","+StringUtils.join(value , ","));
}
}
Run Code Online (Sandbox Code Playgroud)
使用java lambdas有更好的方法吗?可能使用地图功能?
注意:StringUtils是commons-lang lib的一部分:
<dependency>
<groupId>commons-lang</groupId> …Run Code Online (Sandbox Code Playgroud) 我想使用Java 8 Streams替换以下for-each循环:
for (Rule rule : this.rules) {
if (rule.getCondition().evaluate(rule, record)) {
Records.emit(collector, outputStreamMapping.get(rule.getOutputStream()), tuple, recordId, record);
collector.ack(tuple);
ruleApplied = true;
break;
}
}
if (!ruleApplied) {
LOGGER.warn("No rule was applied to record {}", record);
LOGGER.debug("Rules: {}", this.rules);
ErrorReporter.emitErrorNode(this.collector, recordId, componentName,
"No matching rule for record " + record, record);
collector.fail(tuple);
}
Run Code Online (Sandbox Code Playgroud)
我想迭代一组规则,并评估每个规则的条件.如果条件适用,我会对该记录采取行动并停止处理.如果没有应用规则,那么我想记录它并执行不同的记录处理.
不过,我不确定如何做到这一点.任何帮助和解释将不胜感激.
编辑:
我试过这个:
this.rules.stream().filter(rule -> rule.getCondition().evaluate(rule, record)).forEach((rule) -> {
Records.emit(collector, outputStreamMapping.get(rule.getOutputStream()), tuple, recordId, record);
collector.ack(tuple);
ruleApplied = true;
break;
});
Run Code Online (Sandbox Code Playgroud)
当然,它不喜欢break语句,并且还抱怨ruleApplied不是最终的,因为它被声明在lambda的范围之外.
基于我所看到的答案,似乎循环是最干净的方式.我不确定是否有其他流构造允许我以与在基本循环中所做的不同的方式封装逻辑(即,中断和跟踪布尔).
EDIT2:
以下是基于此主题建议的解决方案: …
如果您只有一个Class对象,一个人如何获得方法引用到的方法,如toString?稍后我们将有这个特定类的实例,我们将通过方法引用调用此方法.
例如,考虑Java枚举,它的子类Enum.这里T定义为<T extends Enum>.
Class c = MyEnum.class
…
Function< T , String> f = c :: toString ;
Run Code Online (Sandbox Code Playgroud)
我收到一条错误,说"无效的方法参考".
我已经下载了Mars MIPS Simulator .jar文件,我从oracle下载了java jdk文件.每当我打开jar文件时,IDE就在那里,但一切都是灰色的.我甚至无法编辑窗口中的文本.当您选择"执行"时,下面的框中会出现三个截止窗口,一个标题为"文本段",一个"数据段"和一个"标签".我认为这是一个失败的安装,但我不知道还能做什么.感谢您的任何帮助!
这是一个截图:
当使用Java 8流时,我经常发现我需要重构一个多语句lambda表达式.我将用一个简单的例子来说明这一点.假设我已经开始编写这段代码:
Stream.of(1, 3).map(i -> {
if (i == 1) {
return "I";
} else if (i == 3) {
return "E";
}
return "";
}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
现在我不太喜欢map通话中的大型lambda表达式.因此,我想把它重构出来.我看到两个选项,要么我Function在我的班级中创建一个实例:
private static Function<Integer, String> mapper = i -> {
if (i == 1) {
return "I";
} else if (i == 3) {
return "E";
}
return "";
};
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
Stream.of(1, 3).map(mapper).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
或者我只是制作一个方法:
private static String map(Integer i) {
if (i == 1) {
return "I";
} else if …Run Code Online (Sandbox Code Playgroud) 通过Twitter,我发现了博客文章.由于我目前正在探索Java 8,我尝试在其中运行示例.有一件事是我无法在示例中找到类Lists(实现a map):
Function<String, String> identity = (s -> s); // return the argument
List<String> ls = Arrays.asList("Alice", "Bob", "Christine");
List<String> l2 = Lists.map(ls, identity); // [Alice, Bob, Christine] <- the same thing!
Run Code Online (Sandbox Code Playgroud)
任何人都知道我可以在哪里找到它以使示例运行?
谢谢