4 ms·
> 1. Stop creating counters/loops and become facile with map, reduce, and the like. This will shift your thinking away from blocks and toward functions. I am n
by kyawzazaw 6y ago
> 1. Stop creating counters/loops and become facile with map, reduce, and the like. This will shift your thinking away from blocks and toward functions.
I am not very comfortable with this. How can I learn to do this in traditionally non-FP languages like Java? (Am CS undergrad student)
- Jtsummers 6y agoCaveat: I haven't touched Java in years, and that was not even a current version of Java at the time (well, it was old code made to run on the then-current JVM, but not utilizing any features introduced after 2006 or so). I'm assuming these are good resources, but I'm not sure. https://developer.ibm.com/technologies/java/series/java-8-idioms/ https://developer.ibm.com/technologies/java/series/java-8-id... List of articles relating to idiomatic Java 8 code. Some of these touch on using lambdas and functional idioms. https://developer.ibm.com/articles/j-java8idioms3/ https://developer.ibm.com/articles/j-java8idioms3/ This one shows a few of the functional-styled methods that can be used (foreach, takewhile, iterate, etc.). https://developer.ibm.com/articles/j-java8idioms2/ https://developer.ibm.com/articles/j-java8idioms2/ Shows the collection pipeline pattern. I have experience with the same things in C# and other languages, the way they're using them in these articles are what I'd expect from a comparable API.
- braindongle 6y agoI can't speak authoritatively about Java, but it looks like map-reduce is available in Java 8 by casting a collection to a stream [0]. Considering the definitions of map and reduce can help one see how they can replace loops/counters: MAP: Take a collection, say a list/array or a dictionary/hash, and perform some function on each member of the collection, returning a new collection who's members are the return values for each original member. It's a loop, but no loop! REDUCE: Do the same thing as map, but carry along an output variable, and have your function's output for each member (potentially) mutate that output variable. Summing is a basic example. I'm not specifically recommending preferring this in Java as a step towards functional programming. It's in, uh, more terse languages like Python and Ruby where the payoff is obvious [1][2]. And among not-functional programming languages, it's not just dynamic languages, either. Consider Dart (and seriously, consider Dart) [3]. Also, Javascript, which has had many features shoehorned-in over the years, has these and related functions. [0] https://www.java67.com/2016/09/map-reduce-example-java8.html https://www.java67.com/2016/09/map-reduce-example-java8.html [1] Double some numbers Python: result = map(lambda x: x + x, array_of_numbers) [2] In Ruby: result = array_of_numbers.map{|x| x + x} [3] In Dart: result = arrayOfNumbers.map((x) => x + x).toList();
- braindongle 6y agoOne other thing. You will be thinking functions first if you get into data science, say with Python/Pandas. In general, Pandas functions are vectorized, meaning that they operate on members of a collection in parallel. You really don't want to write a loop that iterates over some 5,000,000 member collection and applies some expensive function serially.
- braindongle 6y agoOne other other thing. Functional thinking has greatly changed the landscape of client-server applications that are hosted in the cloud as well. If your aim is apps, maybe don't bother to master the skills needed to set up and maintain a Linux server (although if you follow OP's other suggestions, you're well on your way). Instead, consider your backend as a network of microservices, functions, that each do one thing and do it with side effects only when necessary. The host for your app? Poof! That's AWS/GCP/Azure's problem.
- kyawzazaw 6y agoThanks. My school (Macalester College) recently started introducing some fp constructs/concepts in our intro class such as map, reduce like you mentioned. It was long after I took it and now I am TA-ing. Oddly enough, I am more comfortable approaching this style in Kotlin.