何时使用折叠以及何时在Scala中使用foreach列表

时间:2016-12-01 12:40:23

标签: scala functional-programming

在我的理解中,当需要对列表中的每个元素应用函数时,我们使用fold函数,对吧?

如果只是迭代列表,foreach就够了吗?

3 个答案:

答案 0 :(得分:6)

  

在我的理解中,当需要对列表中的每个元素应用函数时,我们使用fold函数,对吧?

不。如果要获得的结果是全部列表中的元素,则可以使用折叠。也就是说,您将列表fold转换为一个结果

要在列表的每个元素上应用相同的功能,主要用于打印到屏幕等副作用,请使用foreach,因此使用名称。

答案 1 :(得分:5)

<强> fold

如果希望将集合聚合为单个值,请使用fold。在这里我们说,从零开始并将每个连续元素添加到前一个元素,然后在集合耗尽后返回结果。

scala> List(1, 2, 3).foldLeft(0){ (a, b) => a + b }
res10: Int = 6

请注意,fold是为并行计算而设计的,但foldLeftfoldRight在应用哪些类型方面更为强大。

<强> map

如果要将函数应用于集合中的每个元素并使用结果返回另一个集合,请使用map

scala> List(1, 2, 3).map(x => x + x)
res12: List[Int] = List(2, 4, 6)

<强> foreach

如果您不想返回任何内容但需要一些副作用,请使用foreach,例如。将每个值保存到数据库。

List(1, 2, 3).foreach(x => saveToDB(x))

答案 2 :(得分:3)

如果您想减少列表,则使用折叠

List(1,2,3,4).foreach(println)

Foreach用于迭代列表,例如打印所有元素

18:10:57,894 ERROR [io.undertow.request] (default task-18) UT005023: Exception handling request  java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.SerializationConfig.withDefaultPrettyPrinter(Lcom/fasterxml/jackson/core/PrettyPrinter;)Lcom/fasterxml/jackson/databind/SerializationConfig;
at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:86)
at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:67)
at com.fasterxml.jackson.dataformat.xml.XmlMapper.<init>(XmlMapper.java:49)

.......:46
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)