标签: flatmap

在flatMap返回List <Object>而不是List <String>之后收集Java Stream

我使用Java 8流尝试了以下代码:

Arrays.asList("A", "B").stream()
            .flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我得到的是List<Object>我想要的一段时间List<String>.如果我删除收集,我尝试:

Arrays.asList("A", "B").stream().flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1));
Run Code Online (Sandbox Code Playgroud)

我正确得到了Stream<String>.

我哪里错了?有人能帮我吗?

提前谢谢了.

编辑:

问题是由于Eclipse(现在使用Kepler SR2和java 8补丁1.0.0.v20140317-1956).如果使用javac进行编译,或者如Holger所评论,使用Netbeans进行编译,则不会出现此问题

java eclipse java-8 java-stream flatmap

3
推荐指数
1
解决办法
4452
查看次数

如何flatMapToLong一个流<List <Long >>?

我有这个方法:

public static long sumDigits(final List<Long> list) {
    return list
            .stream()
            .map(l -> toDigits(l))
            .flatMapToLong(x -> x.stream())
            .sum()
}
Run Code Online (Sandbox Code Playgroud)

toDigits有这个签名:

List<Long> toDigits(long l)
Run Code Online (Sandbox Code Playgroud)

在flatMapToLong行上,它给出了这个错误

类型不匹配:无法从Stream <Long>转换为LongStream

当我改为

flatMapToLong(x -> x)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

类型不匹配:无法从List <Long>转换为LongStream

唯一有效的是这个

public static long sumDigits(final List<Long> list) {
    return list
            .stream()
            .map(l -> toDigits(l))
            .flatMap(x -> x.stream())
            .reduce(0L, (accumulator, add) -> Math.addExact(accumulator, add));
}
Run Code Online (Sandbox Code Playgroud)

java collections lambda java-stream flatmap

3
推荐指数
1
解决办法
3651
查看次数

Swift 1.2中可选展开的Map和flatMap差异

双方mapflatMap都defind上ImplicitlyUnwrappedOptional,但他们根据不同的文件(显然)在他们的定义:

func map(f:@noescape(T) - > U) - > U!

如果self == nil,则返回nil.否则,返回f(self!).

func flatMap(f:@noescape(T) - > U!) - > U!

返回f(自我)!iff self和f(self)不是nil.

我尝试使用它们的一个简单示例:

let number: Int? = 1

let res1 = number.map { $0 + 1 }.map { $0 + 1 }
let res2 = number.flatMap { $0 + 1 }.flatMap { $0 + 1 }

res1 //3
res2 //3
Run Code Online (Sandbox Code Playgroud)

但是,他们生产的相同的结果,即使numbernil. 我的问题是,它们之间有什么实际的区别,如果我申请mapflatMapImplicitlyUnwrappedOptionalS' 我应该选择哪一个以及何时?

dictionary bind optional flatmap swift

3
推荐指数
2
解决办法
2549
查看次数

flatMap究竟做了什么?

对于学校的编码工作,我必须做平板图的工作,但我完全不知道它做了什么,我已经在网上阅读了几页,并在我的教科书中阅读,但我仍然没有真正理解它的作用.我知道地图有什么作用,但由于某种原因,我很难将头部包裹在flatmap中.有人可以帮忙吗?谢谢.

只是为了添加更多信息 - 当我在线查看示例时,我会看到flatmap如何返回与地图不同的内容.但是当flatmap被调用时,它实际上在做什么呢?flatmap如何实际工作?它在返回结果之前做了什么?

scala flatmap

3
推荐指数
2
解决办法
651
查看次数

为什么VectorMap [Option [Int]]上的flatMap的mapper函数结果不是Vector [Option [Int]]有效?

例如,

Vector(Some(1), Some(2), Some(3), None).flatMap{
  n => n
}
Run Code Online (Sandbox Code Playgroud)

产生一个Vector(1, 2, 3)而不是给出一个错误.正如我在其他语言中看到的那样,flatMap当你有一个生成嵌套的mapper函数时使用,所以我希望这是一个有效的flatMap:

Vector(1, 2, 3).flatMap{
  eachNum => Vector(eachNum)
}
Run Code Online (Sandbox Code Playgroud)

我的mapper函数产生一个Vector会导致嵌套(即Vector(Vector(1), Vector(2), Vector(3), Vector(4))),如果我使用了一个map由于容器包装.但是,flatMap将删除此嵌套并将其展平.当有两个相同的monad嵌套时,这是有意义的.

但是,我不明白如何使用一个flatMapmapper函数返回一个Optionmake Vector[Option[Int]]成为a Vector[Int].是否存在某种转变(我以前从未见过这种转变),有人可以解释并且可能指向我一些资源吗?

非常感谢你

monads functional-programming scala flatmap

3
推荐指数
1
解决办法
350
查看次数

RxJava - flatmap vs concatMap - 为什么在订阅时订购相同?

根据这个线程, conCatMap和flatmap仅根据项目的发射顺序而不同.所以我做了一个测试并创建了一个简单的整数流,并希望看到它们将以什么顺序发出.我制作了一个小的可观察量,它将在1-5的范围内取数,并将它们乘以2.简单.

以下是flatmap的代码:

myObservable.flatMap(new Func1<Integer, Observable<Integer>>() {
        @Override
        public Observable<Integer> call(Integer integer) {
            return Observable.just(integer * 2);
        }
    }).subscribe(new Observer<Integer>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {
        Log.v("myapp","from flatMap:"+integer);
        }
    });
Run Code Online (Sandbox Code Playgroud)

和使用concatMap完全相同的代码:

myObservable.concatMap(new Func1<Integer, Observable<Integer>>() {
        @Override
        public Observable<Integer> call(Integer integer) {
            return Observable.just(integer * 2);
        }
    }).subscribe(new Observer<Integer>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void …
Run Code Online (Sandbox Code Playgroud)

rx-java flatmap concatmap

3
推荐指数
1
解决办法
2314
查看次数

Swift中的FlatMap和Init

结构

我尝试在dotSwift 2016 Demo中重新创建Chris Edihoff演示的代码.这是代码.

struct List {
    let name:String
    let id:Int
}

extension List {
    init?(json: [String:AnyObject]) {
        guard
            let name = json["name"] as? String,
            let id = json["id"] as? Int else
        {
            return nil
        }
        self.name = name
        self.id = id
    }
}

let listData = json["data"] as? [[String:AnyObject]]
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切似乎都很好.但这就是问题所在.他做了这样的事情:

let list:[List] = listData.flatMap(List.init)
Run Code Online (Sandbox Code Playgroud)

上面的行应该是返回列表对象的数组.Chris Edihoff似乎没有遇到任何问题,但是当我这样做时,Xcode警告说

- flatMap生成'U?',而不是预期的上下文结果类型'_?

还有什么在List.init这里?我从未见过这种初始化对象的方式.它应该是List()或者如果我们在这里使用客户初始化,那应该是List(json:someObject)对的吗?

参考Chris Edihof讲座:https://www.youtube.com/watch?v = ewk-XNzXzAA

functional-programming ios flatmap swift

3
推荐指数
1
解决办法
1392
查看次数

3嵌套for-each循环为Java Stream(或更好的并行流)

在我目前正在进行的项目中,我们有三个嵌套for循环的构造:

List<OutputDataType> resultList = new ArrayList<>();

for (OrgStructureEntity product : products) {

       for (String region : regions) {

                for (SalesType salesType : SalesType.values()) {

                    resultList.addAll(new SalesRequest(getConnection(),
                            product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType,
                            exchangeRates).calculateSalesKpis());
                }    
       }
}
Run Code Online (Sandbox Code Playgroud)

产品和地区都是套装.resultList是一个带有"OutputDataType"对象的ArrayList.方法calculateSalesKpis()还返回"OutputDataType"对象的列表.应该将所有这些对象添加到resultList中.我想用并行流完成所有这些以使其更快,但我没有比这更进一步:

products.stream()
                .map(product -> regions.stream()
                        .map(region -> Arrays.stream(SalesType.values())
                                .map(salesType -> new SalesRequest(getConnection(),
                                        product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType,
                                        exchangeRates).calculateSalesKpis())))
                .
Run Code Online (Sandbox Code Playgroud)

我现在不知道如何将它全部放在结果列表中以及如何正确关闭流.我希望你能帮帮我 :)

java foreach java-8 java-stream flatmap

3
推荐指数
1
解决办法
618
查看次数

在map()上使用单个flatMap()是否更好?flatMap()?

我想知道两种平面图之间是否存在任何显着差异.

情况1:

someCollection
    .stream()
    .map(CollectionElement::getAnotherCollection)
    .flatMap(Collection::stream);
Run Code Online (Sandbox Code Playgroud)

案例2:

someCollection
    .stream()
    .flatMap(element -> element.getAnotherCollection().stream());
Run Code Online (Sandbox Code Playgroud)

应该首选哪一个?在性能方面有哪些更好?

java java-stream flatmap

2
推荐指数
1
解决办法
102
查看次数

功能标量 - 如何避免在可选映射上进行深度嵌套

我有一组按顺序完成的操作,但如果中间序列返回"null",我想提前中止操作(跳过后续步骤).

我编造了这样其给定的输入参数的功能,执行对Redis的几个操作,如果它存在,会返回一个产品.由于其中一个中间请求可能返回空值,因此完整的操作可能会"失败",并且我希望将之后发生的不必要的步骤短路.

这里的筑巢变得疯狂,我想让它更清晰.是否有适当的"功能"方式来执行此类"if/else"短路?

def getSingleProduct(firstSku: String): Option[Product] = {
    val jedis = pool.getResource
    val sid: Array[Byte] = jedis.get(Keys.sidForSku(firstSku, sectionId, feedId).getBytes)
    Option(sid).flatMap {
      sid: Array[Byte] =>
        Option(jedis.get(Keys.latestVersionForSid(sectionId, feedId, sid))) flatMap {
          version: Array[Byte] =>
            Option(Keys.dataForSid(sectionId, feedId, version, sid)) flatMap {
              getDataKey: Array[Byte] =>
                Option(jedis.get(getDataKey)) flatMap {
                  packedData: Array[Byte] =>
                    val data = doSomeStuffWith(packedData)
                    Option(Product(data, "more interesting things"))
                }
            }
        }
    }
  }
Run Code Online (Sandbox Code Playgroud)

functional-programming scala optional flatmap

2
推荐指数
1
解决办法
55
查看次数