Lambda wyrażenie zczytujące ilość linii w pliku

0

Cześć,
Muszę przygotować do szkoły zadanie, które polega na tym, że wywołuje następująco:

String path = sciezka;
Klasa klasa = new Klasa(path).metoda(ileLinii);

"metoda" znajduje się w klasie "Klasa".
"ileLinii" to moje lambda wyrażenie, które jest funkcją i implementuje je w innej klasie, w tym przypadku main.

Na ten moment wygląda to tak:

Function<String, Integer> ileLinii = line -> {
        return null;
	}; 

Rozumiem, że muszę jakoś w "ileLinii" otworzyć plik i policzyć ilość linii i je zreturnować tylko jak dostać się do pliku z tego poziomu?
W metodzie "metoda" muszę wykonać tylko metodę "apply" ale no nie wiem w ogóle jak policzyć te linie...

0

o_O

class Klasa{
    private final String path;
    public Klasa(String p){
        path = p;
    }
 
   public Long metoda(Function<String, Long> f){
       return f.apply(path);
   }
}

No i oczywiście

Function<String, Long> ileLinii = path -> Files.lines(Paths.get(path)).collect(Collectors.counting());

(pisane z palca, moze sie nie skompilować z jakiegoś głupiego powodu, ale idea jest ok).

0

Super, dziękuje za pomoc.

0

Jeszcze chciałbym spytać, poniewaz przypomniałem sobie.

Jeśli mam kilka takich lambda wyrażeń w tablicy "Functionów" i chciałbym aby po kolei się wykonywały.
Znalazłem że jest metoda andThen ale nie do końca wiem jak to użyć. Powinienem zrobić po kolei wywołanie w zależności od tego ile mam lambd w tablicy?

Czyli, że jeśli mam 3 funkcje to powinno to być.

tab[0].apply(path).andThen(tab[1].apply)

itd?

0

Blisko, ale nie tak, bo co będzie jak tablica ma np. 4 elementy, a twoja funkcja uwzględnia tylko 3 albo 5 elementowe tablice?

public Function<?,?> reduce(Function<?,?>...fs){
		return Arrays.stream(fs)
					.reduce(Function::andThen)
					.orElseGet(Function::identity);
	}

Przy czym tracisz całe bezpieczeństwo typów i musisz samodzielnie zadbać o to by funkcje przyjmowały i zwracały parametry o określnym typie i były w określonej kolejności jako argumenty:

Function i = 	i -> (Integer)i + 1;
Function j = 	j -> (Integer)j + 2;
Function k = 	k -> (Integer)k + 3;

Function reduce = reduce(i, j, k);

ps. Java to jest jednak biedny język...

1 użytkowników online, w tym zalogowanych: 0, gości: 1