java函數(shù)式編程其實就是在一個接口中有一個抽象方法的接口,稱為函數(shù)式接口,當然接口可以包含其他的方法,比如默認、靜態(tài)、私有,那java函數(shù)式編程使用場景是什么?下面來我們就來給大家講解一下。
首先,我們先定義一個函數(shù)式編程接口
@FunctionalInterfacepublic interface BooleanFunctionalInterface { boolean test(T t); }
很簡單,該接口的唯一一個抽象方法(并且非Object類的方法)返回值為boolean
下面,定義一個方法,接受一個List,利用實現(xiàn)了該接口的test方法的對象,篩選出需要的元素:
import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; public class Filter { public staticListfilter(Listlist, BooleanFunctionalInterface b) { if (CollectionUtils.isEmpty(list)) { return new ArrayList < > (0); } Listresult = new ArrayList < > (list.size()); for (int i = 0; i < list.size(); p = "" i++) { <= "" > T t = list.get(i); if (b.test(t)) { result.add(t); } } return result; } }
測試類,篩選出年齡大于25的People對象:
public class FunctionalInterfaceTest { private ListpeopleList = new ArrayList < > (); @Before public void init() { peopleList.add(new People("LuoTianyan", 23)); peopleList.add(new People("ff", 26)); peopleList.add(new People("Tony", 33)); } @Test public void testUserDefined() { Listfilter = Filter.filter(peopleList, p - > ((People) p) .getAge() > 25); filter.forEach(System.out::println); } }
import lombok.*; @Getter @Setter @ToString @AllArgsConstructor @NoArgsConstructorpublic class People { private String name; private int age; }
JDK中已有的函數(shù)式接口
上面的自定義的函數(shù)式接口,返回boolean,其實在Java8中已經(jīng)有該類型的接口,那就是Predicate。
Predicate
該接口定義了一個支持泛型的boolean test( T)的抽象方法,其函數(shù)描述符為 (T)->
boolean,現(xiàn)在我們就可以直接使用Predicate
在上面的Filter類中追加一個方法,修改這里形參為Predicate。
public staticListpredicate(Listlist, Predicate predicate) { if (CollectionUtils.isEmpty(list)) { return new ArrayList < > (0); } Listresult = new ArrayList < > (list.size()); for (int i = 0; i < list.size(); p = "" i++) { <= "" > T t = list.get(i); if (predicate.test(t)) { result.add(t); } } return result; }
獲取Age>25的People對象,測試如下:
@Test public void testPredicate() { Listpredicate = Filter.predicate(peopleList, p - > ((People) p) .getAge() > 25); predicate.forEach(System.out::println); }
Consumer
該接口定義了一個void accept(T)的抽象方法,其函數(shù)描述符為 (T) ->
void,如果你需要一個操作某一對象,但無需返回的的函數(shù)式接口,那么就可以使用Consumer
追加方法,形參為Consumer:
public staticvoid consumer(Listlist, Consumer consumer) { if (CollectionUtils.isEmpty(list)) { return; } Listresult = new ArrayList < > (list.size()); for (int i = 0; i < list.size(); p = "" i++) { <= "" > T t = list.get(i); consumer.accept(t); } }
下面實現(xiàn)修改所有Age為18,并且輸出,測試如下:
@Test public void testConsumer() { // setAge操作不需要返回值 ConsumersetAgeConsumer = p - > ((People) p) .setAge(18); Filter.consumer(peopleList, setAgeConsumer); // 輸出操作不需要返回值 Consumersout = p - > System.out.println((People) p); Filter.consumer(peopleList, sout); }
Supplier
既然有消費者接口(Consumer
追加方法,形參Supplier
public staticListlistFactory(int count, Suppliersupplier) { Listresult = new ArrayList < > (count); for (int i = 0; i < count; p = "" i++) { <= "" > T t = supplier.get(); result.add(t); } return result; }
下面生成count個對象,設置對象默認屬性值:
@Test public void testSupplier() { // 生成對象 SupplierpeopleSupplier = () - > new People("init", 18); Listpeople = Filter.listFactory(5, peopleSupplier); // 輸出操作不需要返回值 Consumersout = p - > System.out.println((People) p); Filter.consumer(people, sout); }
Function
該接口定義了一個 R
apply(T)類型的抽象函數(shù),它接受一個泛型變量T,并返回一個泛型變量R,如果你需要將一個對象T映射成R,那么就可以使用Function
下面,我們將對象轉(zhuǎn)化為String類型的例子
public staticListfunction(Listlist, Functionfunction) { if (CollectionUtils.isEmpty(list)) { return new ArrayList < > (0); } Listresult = new ArrayList < > (list.size()); for (int i = 0; i < list.size(); p = "" i++) { <= "" > T t = list.get(i); String apply = function.apply(t); result.add(apply); } return result; }
將People對象,轉(zhuǎn)換為的字符串輸出:
@Test public void testFunction() { // 將People對象,轉(zhuǎn)換為如下形式的字符串 Functionfunction = (People p) - > "name:" + p.getName() + " , age:" + p.getAge(); Liststrings = Filter.function(peopleList, function); // 輸出操作不需要返回值 Consumersout = p - > System.out.println(p); Filter.consumer(strings, sout); }
上面代碼的優(yōu)化
由于上面的people是list集合,可以直接利用stream的形式;
比如People對象轉(zhuǎn)換成字符串
@Test
public void testListStream() { Listcollect = peopleList.stream() .map(p - > p.getName() + p.getAge()) .collect(Collectors.toList()); collect.forEach(System.out::println); }
java函數(shù)式編程能夠減少了可變量的聲明,進行更好的利用并行,并且代碼會更加簡潔和可讀,因此java函數(shù)式編程還是很有必要的。最后大家如果想要了解更多初識java知識,敬請關注賦能網(wǎng)。
本文鏈接:
本文章“java函數(shù)式編程使用場景是什么?java函數(shù)式編程使用場景”已幫助 55 人
免責聲明:本信息由用戶發(fā)布,本站不承擔本信息引起的任何交易及知識產(chǎn)權侵權的法律責任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓機構》培訓課程》學習資訊》課程優(yōu)惠》課程開班》學校地址等機構信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579