假设我有多个角色,每个角色定义一组项目:
package A;
use Moose::Role;
sub items () { qw/apple orange/ }
package B;
use Moose::Role;
with 'A';
sub items () { qw/watermelon/ }
package C;
use Moose::Role;
sub items () { qw/banana/ }
Run Code Online (Sandbox Code Playgroud)
假设我在另一个类中使用它们,我想收集所有这些项目:
package Foo;
use Moose;
with qw(B C);
sub do_something {
my $self = shift;
my @items = ???; # How can I get apple, orange, watermelon, banana here?
....
}
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方案是采用MooseX :: ComposedBehavior,但是它的POD说(当然在编写时)它的API"不太稳定",而且"当前的实现是一种破解,应该被替换通过更健壮的一个".因此,我正在调查这是否可以在不依赖于这种"黑客"的情况下完成.
警告:如果您将来阅读此内容,请查看MooseX :: ComposedBehavior的POD (当前版本:0.003),因为它可能在平均时间内发生了变化.事情变化很快.CPAN作者发布了新版本.目前"不太稳定"的东西可能在未来变得更加稳定.甚至可能还有其他模块.自行检查.
理想情况下应该有类似的东西:my @items …
我想我错过了一些东西:
scala> Some(1) collect ({ case n if n > 0 => n + 1; case _ => 0})
res0: Option[Int] = Some(2)
scala> None collect ({ case n if n > 0 => n + 1; case _ => 0})
<console>:6: error: value > is not a member of Nothing
None collect ({ case n if n > 0 => n + 1; case _ => 0})
^
<console>:6: error: value + is not a member of Nothing
None …Run Code Online (Sandbox Code Playgroud) 我不时地需要迭代容器元素的一个子集,或者只想提取它们而忽略其余部分.我最终boost::range::adaptors::filtered用来创建这个懒惰的集合.
for(auto&& i : container | filtered(predicate)) {
// .. do stuff
}
Run Code Online (Sandbox Code Playgroud)
是否有理由在STL中缺少收集算法(如在Ruby的收集中)(我们只有copy_if不相同)?或者反对使用它的任何理由?
可能的实现可能是:
template<class Container, class Predicate>
Container collect(Container&& c, Predicate&& p) {
Container n;
for(auto&& i : c) {
if(p(i)) {
n.push_back(i);
}
}
return n;
}
Run Code Online (Sandbox Code Playgroud)
但是lazy_collect也可能有助于避免复制.
以下所有答案都很棒.我希望我可以标记所有这些.我不知道std::back_inserter.收集东西现在很简单:
boost::copy( orig | filtered(predicate), std::back_inserter(collection));
Run Code Online (Sandbox Code Playgroud) 我需要你的建议来简化下面的代码.我有一个玩家列表,其中包含赢得的游戏ID.我想从这个列表中提取2个最佳玩家(2个拥有更好匹配ID的玩家)一旦被提取,我必须返回初始列表以进行其他操作.我认为可以在优化或阅读方面改进此代码.如果你能帮助我.
public class PlayerStatistics {
int id
String name;
int idMatchWon; // key from Match
// getter , setter
}
public static void main(String[] args) throws Exception {
List<PlayerStatistics> _players = new ArrayList<PlayerStatistics>();
_players.add(initialize(1,'John',4));
_players.add(initialize(2,'Teddy',2));
_players.add(initialize(3,'Kevin',3));
// How to get Top 2
List<PlayerStatistics> _top2Players = extractTop2Players(_players);
}
private List<PlayerStatistics> extractTop2Players (List<PlayerStatistics> _list) {
List<PlayerStatistics> _topPlayers = new ArrayList<PlayerStatistics>();
// 1. Group and count
Map<String, Long> _players = _list
.stream()
.filter(x -> (!"".equals(x.getName()) && x.getName()!= null) )
.collect(
Collectors.groupingBy(
PlayerStatistics::getName, Collectors.counting() …Run Code Online (Sandbox Code Playgroud) 如下:
IntStream iStream = IntStream.range(1,4);
iStream.forEach(System.out::print);
List list1 = iStream.collect(Collectors.toList());//error!
Run Code Online (Sandbox Code Playgroud)
Java 1.8编译器提供类型推导错误.类似的代码可以用于String类型:
List<String> ls = new ArrayList<>();
ls.add("abc");
ls.add("xyz");
List list2 = ls.stream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
为什么?IntStream/LongStream/DoubleStream的工作方式与其他类型不同吗?如何修复我的编译错误?
我正在Scala中构建决策树系统,但我的数据中的一些条目具有相同的属性.我通过实现一个"随机"节点类型来解决这个问题,允许查询随机选择要遍历的分支,但是当我尝试随机分割剩余的例子时,我得到一个"MatchError".我目前的代码:
def splitRandom(examples: Array[String]): Array[String]={
examples.collect {case x if(r.nextInt(100) < 50) => x}
}
Run Code Online (Sandbox Code Playgroud)
"examples"是一个字符串数组,每个字符串都是一行,包含一个包含所有属性的数据条目.
我以为我已经很擅长 Java 8 流了,但后来……
我有一个Foo界面:
public interface Foo {
String getKey();
Stream<Bar> bars();
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用每个键Stream<Foo>将 a收集到 aMap<String, Foo>中:
Map<String, Foo> foosByKey = fooStream.collect(
Collectors.toMap(Foo::getKey, Function.identity()));
Run Code Online (Sandbox Code Playgroud)
但是如果我想将它们收集到一个Map<Bar, Foo>? 换句话说,对于FooSteamFoo中的每一个,我想把它放在映射到Bar由Foo.bars(). 我从哪里开始?
我有以下数组:
$array = [
'2' => ['3' => ['56' => '2'], '6' => ['48' => '2']],
'4' => ['4' => ['433' => '2', '140' => '2'], '8' => ['421' => '2', '140' => '2']],
'5' => ['5' => ['88' => '4', '87' => '2']]
];
Run Code Online (Sandbox Code Playgroud)
以下代码(拼合)应通过保留键返回,但不是吗?
collect($array)->flatten(1);
Run Code Online (Sandbox Code Playgroud)
应该给我
[
'3' => ['56' => '2'],
'6' => ['48' => '2'],
'4' => ['433' => '2', '140' => '2'],
'8' => ['421' => '2', '140' => '2'],
'5' => ['88' => '4', …Run Code Online (Sandbox Code Playgroud) 我有一个格式的 Scala 序列,("Apple-fruit", "Banana-fruittoo", "Chocolate-notafruit")我有另一个格式的 Scala 列表("Apple", "Banana")
我想根据第二个列表过滤我的第一个序列,以便我的最终输出是("Apple-fruit", "Banana-fruittoo"). 任何人都可以帮助我使用此过滤器功能吗?
我试图collect通过阅读一些文档来了解函数的全部功能。我遇到了一些挑战,特别是在页面上引用的最后一个例子中(也在下面列出,我的评论内嵌)
let results = [Ok(1), Err("nope"), Ok(3), Err("bad")];
let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
// gives us the first error <-- Point 1
assert_eq!(Err("nope"), result);
let results = [Ok(1), Ok(3)];
let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
// gives us the list of answers
assert_eq!(Ok(vec![1, 3]), result);
Run Code Online (Sandbox Code Playgroud)
我用我自己的一些代码跟进了这段代码(如下所示)
let results: [std::result::Result<i32, &str>; 2] = [Err("nope"), Err("bad")];
let result: Vec<Result<i32, &str>> = results.iter().cloned().collect();
// The following prints <-- Point 2
// "nope"
// "bad"
for x in result{ …Run Code Online (Sandbox Code Playgroud)