val arr = Array(1,5,3,10,2,4,6,9)
scala> arr.sorted
res17: Array[Int] = Array(1, 2, 3, 4, 5, 6, 9, 10)
scala> arr.sortWith((x,y)=>x>y)
res18: Array[Int] = Array(10, 9, 6, 5, 4, 3, 2, 1)
scala> arr.sortWith((x,y)=>x>7)
res19: Array[Int] = Array(9, 10, 1, 5, 3, 2, 4, 6)
val arr2 = Array(1,11,15,2,5,22,27,3,5,6)
// sortBy内是排序规则,不会更改数组内元素的数据类型。
scala> arr2.sortBy(x => x + "")
res22: Array[Int] = Array(1, 11, 15, 2, 22, 27, 3, 5, 5, 6)
// 定义个方法
def m2(x: Int, y:Double): Double = x * y
// 赋值变量
val f2 = m2 _
// 此时f2相当于一个函数,直接调用
f2(4,3.0)
res27: Double = 12.0
val arr = Array(1,2,3,4,5)
scala> def m(x:Int):Int = x * x
m: (x: Int)Int
scala> arr.map(m)
res30: Array[Int] = Array(1, 4, 9, 16, 25)
// 为什么方法也可以当参数进行传入,这是由于内部实现语法糖,将方法转换成函数 相当于 arr.map(m _)
reduce:
val arr = Array(1,2,3,4,5,6,7)
// 计算arr的和
val r = arr.reduce((x, y) => x + y)
// 简写方式:
val r2 = arr.reduce(_ + _)
reduceLeft
val r3 = arr.reduceLeft(_ + _)
println(r3)
叠加操作
val lst = List(1,2,3,4,5)
val f1 = lst.fold(0)(_+_)
val f2 = lst.foldLeft(0)(_+_)
println(f1)
println(f2)
它可以并行话集合,并行多个线程。
lst.aggregate(0)(_ + _.sum, _ + _)
并行集合,充分利用计算机资源:
scala> val arr = Array(1,2,3,4,5,6,7,8,9,10)
arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// par并行化集合
scala> arr.par
res35: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
var r = lst.par.aggregate(0)(_ + _.sum, _+_)
print(r)
val lst = List("Haddop", "Spark", "Flink", "Hbase")
nLst.foreach(w => println(w))
val lst = List("Haddop", "Spark", "Flink", "Hbase")
val nLst = lst.map(_.toUpperCase)
val lLst = lst.map(_.toLowerCase)
// MyListTest.java
package cn._xjk;
import java.util.Arrays;
import java.util.List;
public class MyListTest {
public static void main(String[] args) {
List<String> words = Arrays.asList(new String[]{"Haddop", "Spark", "Flink", "Hbase"});
MyList myList = new MyList(words);
// 扩展的map方法传入逻辑: 传入接口
List<String> nLst = myList.map(new MapFunction() {
@Override
public String call(String word) {
return word.toUpperCase();
}
});
for (String w: nLst
) {
System.out.println(w);
}
}
}
// MyList.java
package cn._xjk;
import java.util.ArrayList;
import java.util.List;
public class MyList {
private List<String> oldList;
public MyList(List<String> words) {
this.oldList = words;
}
public List<String> map(MapFunction func) {
List<String> nList = new ArrayList<>();
for(String oldword: oldList){
// 计算逻辑
String nWord = func.call(oldword);
// 将新的单词保存在新的集合中
nList.add(nWord);
}
return nList;
}
}
// MapFunction
// 规范接口传入,输出数据类型
package cn._xjk;
public interface MapFunction {
// 要求传入String类型, 返回String类型
String call(String word);
}
// MyAdvListTest.java
package cn._xjk.adv;
import java.util.List;
public class MyAdvListTest {
public static void main(String[] args) {
MyAdvList<String> myAdvList = new MyAdvList<>();
myAdvList.add("Hadoop");
myAdvList.add("Spark");
myAdvList.add("Flink");
myAdvList.add("Hbase");
// map
List<String> nList = myAdvList.map(w -> w.toUpperCase()).map(w -> w.toLowerCase() + "2.0");
for (String s: nList){
System.out.println(s);
}
// filter
List<String> nList2 = myAdvList.map(w -> w.toUpperCase()).filter(new MyFunction1<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.startsWith("H");
}
});
for (String s: nList2){
System.out.println(s);
}
}
}
// MyFunction1.java
package cn._xjk.adv;
// T输入类型
// R返回类型
public interface MyFunction1<T, R> {
R call(T t);
}
// MyTraversableLike.java
package cn._xjk.adv;
import java.util.List;
public interface MyTraversableLike<T> {
/*
* 泛型方法,如果方法有未定义泛型,需要在返回值或void前面加上<R>
* */
<R> List<R> map(MyFunction1<T,R> func);
List<T> filter(MyFunction1<T,Boolean> func);
}
// MyAdvList.java
package cn._xjk.adv;
import java.util.ArrayList;
import java.util.List;
/*
* 1. 集合可以传入任何类型: 使用泛型
* 2. 集合要有add,remove等List等具有的方法,还有有map,filter,reduce等方法
* */
// MyTraversableLike 为接口
public class MyAdvList<T> extends ArrayList<T> implements MyTraversableLike<T> {
// 重写map方法
@Override
public <R> MyAdvList<R> map(MyFunction1<T, R> func) {
// 创建新的List
MyAdvList<R> nList = new MyAdvList<>();
// 遍历老List
for (T t: this) {
// 应用外部传入计算逻辑
R r = func.call(t);
// 将返回r放入新的List中
nList.add(r);
}
return nList;
}
@Override
public MyAdvList<T> filter(MyFunction1<T, Boolean> func) {
// 创建新的List
MyAdvList<T> nList = new MyAdvList<>();
// 遍历老List
for (T t: this) {
Boolean flag = func.call(t);
// 将返回r放入新的List中
if (flag){
nList.add(t);
}
}
return nList;
}
}
package cn._xjk.adv;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;
public class StreamDemo {
public static void main(String[] args) {
List<String> words = Arrays.asList(new String[]{"Haddop", "Spark", "Flink", "Hbase"});
// 在Java中,支持Lambda表达式(函数),Stream(链式编程)
// 1.将Java集合变成stream
Stream<String> stream = words.stream();
// 调用filter
Stream<String> result = stream.filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("H");
}
}).map(new Function<String, String>() {
@Override
public String apply(String s) {
return s.toUpperCase() + "3.1";
}
});
// result.forEach(System.out::println);
result.forEach(w -> System.out.println(w));
}
}
stream.filter(w -> w.startsWith("H")).map(w -> w.toUpperCase() + "4.0").forEach(System.out::println);
package cn._xjk
object FunctionTest {
def transform(func:String=>String): List[String] = {
val lst = List("Haddop", "Spark", "Flink", "Hbase")
val nLst = lst.map(func)
nLst
}
def main(args: Array[String]): Unit = {
val f = (s: String) => s.toUpperCase()
val nLst = transform(f)
nLst.foreach(w => println(w))
}
}
原文:https://www.cnblogs.com/xujunkai/p/14413168.html