2016-08-15 55 views
0

這裏是我的榜樣如何計算流處理的元素數量?

我有一個Person類,看起來像

class Person { 
    List<String> keys; 
    Map<String, String> attributes; 

    public Person(List<String> keys, Map<String, String> attributes) { 
     this.keys = keys; 
     this.attributes = attributes; 
    } 

    public List<String> getKeys() { 
     return keys; 
    } 

    public Map<String, String> getAttributes() { 
     return attributes; 
    } 
    } 

我處理一些persons如流,並將其轉換爲JSON作爲

@Test 
    public void testPersonStreamToFile() throws Exception { 
    Person person1 = new Person(Collections.singletonList("key1"), Collections.singletonMap("person1", "key1")); 
    Person person2 = new Person(Collections.singletonList("key2"), Collections.singletonMap("person2", "key2")); 

    File file = temporaryFolder.newFile("personStream.txt"); 
    System.out.println(file.toString()); 

    List<Person> persons = Arrays.asList(person1, person2); 

    Stream<String> personStream = persons 
     .stream() 
     .map(WorkflowTest::mapToJsonString); 


    Files.write(Paths.get(file.toURI()), (Iterable<String>) personStream::iterator); 
    System.out.println("Done"); 
    } 

要求 正如我處理流,我想保留一個Counter,告訴我在節目結束時許多persons被轉換爲JSON

我如何通過Streams來實現?

+4

你可以用一個'peek'方法來保留一個計數器。 – mszymborski

+0

如果這將發生在每一個元素上(因爲沒有一個條件將一些元素分解),'stream'有一個'count()'函數,它將返回其中的元素。 –

+0

或者你可以在JSON轉換方法中增加一些計數器。 – shmosel

回答

2

你可以使用一個peek操作是這樣的:

AtomicInteger counter = new AtomicInteger(0); 

Stream<String> personStream = persons 
    .stream() 
    .map(WorkflowTest::mapToJsonString) 
    .peek(str -> counter.incrementAndGet()); 

你的操作counter.get()後會告訴你mapToJsonString了多少次在這裏調用。

0

嘗試forEach

在給出的例子中,由於您只是映射給定流的元素,所以其大小與count(終端操作,在完成流之後)相同。但是,如果您基於特定標準篩選元素,則可以稍後使用forEach來執行簿記。以下情況如何?

public class StreamFilter { 
    public static void main(String[] args) { 
     final AtomicInteger count = new AtomicInteger(); 
     IntStream.of(1, 2, 3) 
     .filter(i -> i % 2 == 0) 
     .forEach(
       i -> { 
        // do something with the i, e.g. write to file 
        count.incrementAndGet(); // use return value 
       }); 
     System.out.println(count.intValue()); 
    } } 
相關問題