我还是Scala的新手,我读过的其中一件事就是for-comprehension在某种程度上等同于flatMap.但是,在我的代码(下面)中,flatMap的计算时间至少是两倍.这可能是什么原因?
这是一个缓慢的:
facts.flatMap(f => factActionsMap(f)).filter(_.isValid(facts))
Run Code Online (Sandbox Code Playgroud)
这是快速等效的:
for {
f <- facts
a <- factActionsMap(f)
if a.isValid(facts)
} yield a
Run Code Online (Sandbox Code Playgroud)
factActionsMap是Fact和之间的地图Set[Action].
facts只是一个Set[Fact].
我有RDD喜欢(a,b,数组(p1,p2,p3),c),我想在数值里面的数值应用flatmap来得到下面的输出.(a,b,p1,c)(a,b,p2,c)(a,b,p3,c)
为什么RxJava 1.x flatMap()运算符是通过merge实现的?
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
if (getClass() == ScalarSynchronousObservable.class) {
return ((ScalarSynchronousObservable<T>)this).scalarFlatMap(func);
}
return merge(map(func));
}
Run Code Online (Sandbox Code Playgroud)
从flatMap()调用中,我只能返回一个符合的Observable <? extends Observable<? extends R>>。比map(func)调用将它包装到另一个Observable中,这样我们就得到了这样的东西Observable<? extends Observable<? extends R>>。这使我认为map(func)之后的merge()调用是不必要的。
据说merge()运算符执行以下操作:
将可发射Observable的Observable展平为单个Observable,该Observable发射那些Observable发射的项目,而无需进行任何转换。
现在,在平面地图内,我们只能有一个Observable发出一个Observable。为什么要合并?我在这里想念什么?
谢谢。
我需要一些帮助来修改(简化)我的代码.
这是一个例子:
def getBids(rawBids: RDD[List[String]], exchangeRates: Map[String, Double]): RDD[BidItem] = {
rawBids.filter(bidList => !bidList(2).matches(ERROR_REGEXP))
.flatMap(bidList => {
Constants.TARGET_LOSAS.map { losa =>
val indexOfLosa = Constants.BIDS_HEADER.indexOf(losa)
if (bidList(indexOfLosa) != null && !bidList(indexOfLosa).equals("") && isDoubleNumber(bidList(indexOfLosa))) {
BidItem(bidList.head, bidList(1), losa, bidList(indexOfLosa).toDouble)
} else {
BidItem(bidList.head, bidList(1), losa, 0)
}
}
})
.filter(unit => unit.price != 0)
.map(unit => {
val convertedPrice = usdToEur(unit.price, unit.bidDate, exchangeRates)
val convertedDate = changeDateFormat(unit.bidDate)
BidItem(unit.motelId, convertedDate, unit.loSa, convertedPrice)
})
}
Run Code Online (Sandbox Code Playgroud)
我需要更改flatMap方法并避免使用"ELSE"部分代码的情况
据我所知,我们可以使用部分函数或[Option].如果我们的"if"语句为FALSE,它可以帮助我们避免情况.如果我从代码中删除ELSE部分,scala不会给我机会编译我的代码.谢谢!
我有一个如下数组:
var array: [Double] = [4, 5, 2, 4, 3, 6]
Run Code Online (Sandbox Code Playgroud)
我想要做的是从这个数组创建一个新数组,其中包含每个值与前一个值相比的百分比差异.所以我上面的数组看起来像:
var newArray = [0, 25, -60, 100, -25, 100]
Run Code Online (Sandbox Code Playgroud)
如果这有道理?非常感谢任何帮助,非常感谢!!
请建议将路线转换为routeMap的更好方法。
lateinit var routes: List<Pair<String, String>>
val routesMap = HashMap<String, ArrayList<String>>
routes.forEach {
routesMap.getOrPut(it.first) { ArrayList<String>() }.add(it.second)
}
Run Code Online (Sandbox Code Playgroud) 我有下面的清单。
List<String> firstName = List.of("Monika","Shweta", "Shruti","Anuradha");
List<String> lastName = List.of("Mishra","Hariharno","Sharma","Mishra");
List<Integer> sal = List.of(5000000,50,500,100000);
List<List<?>> finalList = List.of(firstName,lastName,sal);
finalList.stream().flatMap(s->s.stream()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
当我使用它打印时,flatMap()它会打印所有firstname, lastname, 然后sal.
我想firstName : lastName:sal按顺序将所有这些打印在一起。例如
Monika:Mishra:5000000
Run Code Online (Sandbox Code Playgroud)
是否可以使用flatMap或任何其他java8功能?
flatmap ×7
scala ×3
java-stream ×2
android ×1
apache-spark ×1
arrays ×1
collections ×1
java ×1
java-8 ×1
kotlin ×1
list ×1
rx-android ×1
rx-java ×1
swift ×1