|
@@ -1,2627 +0,0 @@
|
|
|
-package help
|
|
|
-
|
|
|
-import (
|
|
|
- "fmt"
|
|
|
- "strings"
|
|
|
- "time"
|
|
|
-)
|
|
|
-
|
|
|
-func ExampleKeyValue() {
|
|
|
- m := make(map[int]bool)
|
|
|
- m[10] = true
|
|
|
-
|
|
|
- fmt.Println(From(m).Results())
|
|
|
- // Output:
|
|
|
- // [{10 true}]
|
|
|
-}
|
|
|
-
|
|
|
-func ExampleKeyValue_second() {
|
|
|
- input := []KeyValue{
|
|
|
- {10, true},
|
|
|
- }
|
|
|
-
|
|
|
- m := make(map[int]bool)
|
|
|
- From(input).
|
|
|
- ToMap(&m)
|
|
|
-
|
|
|
- fmt.Println(m)
|
|
|
- // Output:
|
|
|
- // map[10:true]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how
|
|
|
-// to use Range to generate a slice of values.
|
|
|
-func ExampleRange() {
|
|
|
- // Generate a slice of integers from 1 to 10
|
|
|
- // and then select their squares.
|
|
|
- var squares []int
|
|
|
- Range(1, 10).
|
|
|
- SelectT(
|
|
|
- func(x int) int { return x * x },
|
|
|
- ).
|
|
|
- ToSlice(&squares)
|
|
|
-
|
|
|
- for _, num := range squares {
|
|
|
- fmt.Println(num)
|
|
|
- }
|
|
|
- //Output:
|
|
|
- //1
|
|
|
- //4
|
|
|
- //9
|
|
|
- //16
|
|
|
- //25
|
|
|
- //36
|
|
|
- //49
|
|
|
- //64
|
|
|
- //81
|
|
|
- //100
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Repeat
|
|
|
-// to generate a slice of a repeated value.
|
|
|
-func ExampleRepeat() {
|
|
|
- var slice []string
|
|
|
- Repeat("I like programming.", 5).
|
|
|
- ToSlice(&slice)
|
|
|
-
|
|
|
- for _, str := range slice {
|
|
|
- fmt.Println(str)
|
|
|
- }
|
|
|
- //Output:
|
|
|
- //I like programming.
|
|
|
- //I like programming.
|
|
|
- //I like programming.
|
|
|
- //I like programming.
|
|
|
- //I like programming.
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-func ExampleQuery() {
|
|
|
- query := From([]int{1, 2, 3, 4, 5}).Where(func(i interface{}) bool {
|
|
|
- return i.(int) <= 3
|
|
|
- })
|
|
|
-
|
|
|
- next := query.Iterate()
|
|
|
- for item, ok := next(); ok; item, ok = next() {
|
|
|
- fmt.Println(item)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 1
|
|
|
- // 2
|
|
|
- // 3
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Aggregate function
|
|
|
-func ExampleQuery_Aggregate() {
|
|
|
- fruits := []string{"apple", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- // Determine which string in the slice is the longest.
|
|
|
- longestName := From(fruits).
|
|
|
- Aggregate(
|
|
|
- func(r interface{}, i interface{}) interface{} {
|
|
|
- if len(r.(string)) > len(i.(string)) {
|
|
|
- return r
|
|
|
- }
|
|
|
- return i
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(longestName)
|
|
|
- // Output:
|
|
|
- // passionfruit
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AggregateWithSeed function
|
|
|
-func ExampleQuery_AggregateWithSeed() {
|
|
|
- ints := []int{4, 8, 8, 3, 9, 0, 7, 8, 2}
|
|
|
-
|
|
|
- // Count the even numbers in the array, using a seed value of 0.
|
|
|
- numEven := From(ints).
|
|
|
- AggregateWithSeed(0,
|
|
|
- func(total, next interface{}) interface{} {
|
|
|
- if next.(int)%2 == 0 {
|
|
|
- return total.(int) + 1
|
|
|
- }
|
|
|
- return total
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Printf("The number of even integers is: %d", numEven)
|
|
|
- // Output:
|
|
|
- // The number of even integers is: 6
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AggregateWithSeedBy function
|
|
|
-func ExampleQuery_AggregateWithSeedBy() {
|
|
|
- input := []string{"apple", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- // Determine whether any string in the array is longer than "banana".
|
|
|
- longestName := From(input).
|
|
|
- AggregateWithSeedBy("banana",
|
|
|
- func(longest interface{}, next interface{}) interface{} {
|
|
|
- if len(longest.(string)) > len(next.(string)) {
|
|
|
- return longest
|
|
|
- }
|
|
|
- return next
|
|
|
-
|
|
|
- },
|
|
|
- // Return the final result
|
|
|
- func(result interface{}) interface{} {
|
|
|
- return fmt.Sprintf("The fruit with the longest name is %s.", result)
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(longestName)
|
|
|
- // Output:
|
|
|
- // The fruit with the longest name is passionfruit.
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to
|
|
|
-// use Distinct to return distinct elements from a slice of integers.
|
|
|
-func ExampleOrderedQuery_Distinct() {
|
|
|
- ages := []int{21, 46, 46, 55, 17, 21, 55, 55}
|
|
|
-
|
|
|
- var distinctAges []int
|
|
|
- From(ages).
|
|
|
- OrderBy(
|
|
|
- func(item interface{}) interface{} { return item },
|
|
|
- ).
|
|
|
- Distinct().
|
|
|
- ToSlice(&distinctAges)
|
|
|
-
|
|
|
- fmt.Println(distinctAges)
|
|
|
- // Output:
|
|
|
- // [17 21 46 55]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to
|
|
|
-// use DistinctBy to return distinct elements from a ordered slice of elements.
|
|
|
-func ExampleOrderedQuery_DistinctBy() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- products := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- //Order and exclude duplicates.
|
|
|
- var noduplicates []Product
|
|
|
- From(products).
|
|
|
- OrderBy(
|
|
|
- func(item interface{}) interface{} { return item.(Product).Name },
|
|
|
- ).
|
|
|
- DistinctBy(
|
|
|
- func(item interface{}) interface{} { return item.(Product).Code },
|
|
|
- ).
|
|
|
- ToSlice(&noduplicates)
|
|
|
-
|
|
|
- for _, product := range noduplicates {
|
|
|
- fmt.Printf("%s %d\n", product.Name, product.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apple 9
|
|
|
- // lemon 12
|
|
|
- // orange 4
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ThenBy to perform
|
|
|
-// a secondary ordering of the elements in a slice.
|
|
|
-func ExampleOrderedQuery_ThenBy() {
|
|
|
- fruits := []string{"grape", "passionfruit", "banana", "mango", "orange", "raspberry", "apple", "blueberry"}
|
|
|
-
|
|
|
- // Sort the strings first by their length and then
|
|
|
- //alphabetically by passing the identity selector function.
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- OrderBy(
|
|
|
- func(fruit interface{}) interface{} { return len(fruit.(string)) },
|
|
|
- ).
|
|
|
- ThenBy(
|
|
|
- func(fruit interface{}) interface{} { return fruit },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- for _, fruit := range query {
|
|
|
- fmt.Println(fruit)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apple
|
|
|
- // grape
|
|
|
- // mango
|
|
|
- // banana
|
|
|
- // orange
|
|
|
- // blueberry
|
|
|
- // raspberry
|
|
|
- // passionfruit
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use All to determine
|
|
|
-// whether all the elements in a slice satisfy a condition.
|
|
|
-// Variable allStartWithB is true if all the pet names start with "B"
|
|
|
-// or if the pets array is empty.
|
|
|
-func ExampleQuery_All() {
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- }
|
|
|
-
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Age: 10},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 6},
|
|
|
- }
|
|
|
-
|
|
|
- // Determine whether all pet names
|
|
|
- // in the array start with 'B'.
|
|
|
- allStartWithB := From(pets).
|
|
|
- All(
|
|
|
- func(pet interface{}) bool { return strings.HasPrefix(pet.(Pet).Name, "B") },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Printf("All pet names start with 'B'? %t", allStartWithB)
|
|
|
- // Output:
|
|
|
- //
|
|
|
- // All pet names start with 'B'? false
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Any to determine
|
|
|
-// whether a slice contains any elements.
|
|
|
-func ExampleQuery_Any() {
|
|
|
-
|
|
|
- numbers := []int{1, 2}
|
|
|
- hasElements := From(numbers).Any()
|
|
|
-
|
|
|
- fmt.Printf("Are there any element in the list? %t", hasElements)
|
|
|
- // Output:
|
|
|
- // Are there any element in the list? true
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AnyWith
|
|
|
-// to determine whether any element in a slice satisfies a condition.
|
|
|
-func ExampleQuery_AnyWith() {
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- Vaccinated bool
|
|
|
- }
|
|
|
-
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Age: 8, Vaccinated: true},
|
|
|
- {Name: "Boots", Age: 4, Vaccinated: false},
|
|
|
- {Name: "Whiskers", Age: 1, Vaccinated: false},
|
|
|
- }
|
|
|
-
|
|
|
- // Determine whether any pets over age 1 are also unvaccinated.
|
|
|
- unvaccinated := From(pets).
|
|
|
- AnyWith(
|
|
|
- func(p interface{}) bool {
|
|
|
- return p.(Pet).Age > 1 && p.(Pet).Vaccinated == false
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Printf("Are there any unvaccinated animals over age one? %t", unvaccinated)
|
|
|
- // Output:
|
|
|
- //
|
|
|
- // Are there any unvaccinated animals over age one? true
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Append
|
|
|
-// to include an elements in the last position of a slice.
|
|
|
-func ExampleQuery_Append() {
|
|
|
- input := []int{1, 2, 3, 4}
|
|
|
-
|
|
|
- q := From(input).Append(5)
|
|
|
-
|
|
|
- last := q.Last()
|
|
|
-
|
|
|
- fmt.Println(last)
|
|
|
- // Output:
|
|
|
- // 5
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use Average
|
|
|
-//to calculate the average of a slice of values.
|
|
|
-func ExampleQuery_Average() {
|
|
|
- grades := []int{78, 92, 100, 37, 81}
|
|
|
- average := From(grades).Average()
|
|
|
-
|
|
|
- fmt.Println(average)
|
|
|
- // Output:
|
|
|
- // 77.6
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Count
|
|
|
-// to count the elements in an array.
|
|
|
-func ExampleQuery_Count() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
- numberOfFruits := From(fruits).Count()
|
|
|
-
|
|
|
- fmt.Println(numberOfFruits)
|
|
|
- // Output:
|
|
|
- // 6
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Contains
|
|
|
-// to determine whether a slice contains a specific element.
|
|
|
-func ExampleQuery_Contains() {
|
|
|
- slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
|
|
-
|
|
|
- has5 := From(slice).Contains(5)
|
|
|
-
|
|
|
- fmt.Printf("Does the slice contains 5? %t", has5)
|
|
|
- // Output:
|
|
|
- // Does the slice contains 5? true
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use CountWith
|
|
|
-//to count the even numbers in an array.
|
|
|
-func ExampleQuery_CountWith() {
|
|
|
- slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
|
|
-
|
|
|
- evenCount := From(slice).
|
|
|
- CountWith(
|
|
|
- func(item interface{}) bool { return item.(int)%2 == 0 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(evenCount)
|
|
|
- // Output:
|
|
|
- // 6
|
|
|
-}
|
|
|
-
|
|
|
-// The following example demonstrates how to use the DefaultIfEmpty
|
|
|
-// method on the results of a group join to perform a left outer join.
|
|
|
-//
|
|
|
-// The first step in producing a left outer join of two collections is to perform
|
|
|
-// an inner join by using a group join. In this example, the list of Person objects
|
|
|
-// is inner-joined to the list of Pet objects based on a Person object that matches Pet.Owner.
|
|
|
-//
|
|
|
-// The second step is to include each element of the first (left) collection in the
|
|
|
-// result set even if that element has no matches in the right collection.
|
|
|
-// This is accomplished by calling DefaultIfEmpty on each sequence of matching
|
|
|
-// elements from the group join.
|
|
|
-// In this example, DefaultIfEmpty is called on each sequence of matching Pet elements.
|
|
|
-// The method returns a collection that contains a single, default value if the sequence
|
|
|
-// of matching Pet elements is empty for any Person element, thereby ensuring that each
|
|
|
-// Person element is represented in the result collection.
|
|
|
-func ExampleQuery_DefaultIfEmpty() {
|
|
|
- type Person struct {
|
|
|
- FirstName string
|
|
|
- LastName string
|
|
|
- }
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Owner Person
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{FirstName: "Magnus", LastName: "Hedlund"}
|
|
|
- terry := Person{FirstName: "Terry", LastName: "Adams"}
|
|
|
- charlotte := Person{FirstName: "Charlotte", LastName: "Weiss"}
|
|
|
- arlene := Person{FirstName: "Arlene", LastName: "Huff"}
|
|
|
-
|
|
|
- barley := Pet{Name: "Barley", Owner: terry}
|
|
|
- boots := Pet{Name: "Boots", Owner: terry}
|
|
|
- whiskers := Pet{Name: "Whiskers", Owner: charlotte}
|
|
|
- bluemoon := Pet{Name: "Blue Moon", Owner: terry}
|
|
|
- daisy := Pet{Name: "Daisy", Owner: magnus}
|
|
|
-
|
|
|
- // Create two lists.
|
|
|
- people := []Person{magnus, terry, charlotte, arlene}
|
|
|
- pets := []Pet{barley, boots, whiskers, bluemoon, daisy}
|
|
|
-
|
|
|
- results := []string{}
|
|
|
- From(people).
|
|
|
- GroupJoinT(
|
|
|
- From(pets),
|
|
|
- func(person Person) Person { return person },
|
|
|
- func(pet Pet) Person { return pet.Owner },
|
|
|
- func(person Person, pets []Pet) Group { return Group{Key: person, Group: From(pets).Results()} },
|
|
|
- ).
|
|
|
- SelectManyByT(
|
|
|
- func(g Group) Query { return From(g.Group).DefaultIfEmpty(Pet{}) },
|
|
|
- func(pet Pet, group Group) string {
|
|
|
- return fmt.Sprintf("%s: %s", group.Key.(Person).FirstName, pet.Name)
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, s := range results {
|
|
|
- fmt.Println(s)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Magnus: Daisy
|
|
|
- // Terry: Barley
|
|
|
- // Terry: Boots
|
|
|
- // Terry: Blue Moon
|
|
|
- // Charlotte: Whiskers
|
|
|
- // Arlene:
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use Distinct
|
|
|
-//to return distinct elements from a slice of integers.
|
|
|
-func ExampleQuery_Distinct() {
|
|
|
- ages := []int{21, 46, 46, 55, 17, 21, 55, 55}
|
|
|
-
|
|
|
- var distinctAges []int
|
|
|
- From(ages).
|
|
|
- Distinct().
|
|
|
- ToSlice(&distinctAges)
|
|
|
-
|
|
|
- fmt.Println(distinctAges)
|
|
|
- // Output:
|
|
|
- // [21 46 55 17]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to
|
|
|
-// use DistinctBy to return distinct elements from a ordered slice of elements.
|
|
|
-func ExampleQuery_DistinctBy() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- products := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- //Order and exclude duplicates.
|
|
|
- var noduplicates []Product
|
|
|
- From(products).
|
|
|
- DistinctBy(
|
|
|
- func(item interface{}) interface{} { return item.(Product).Code },
|
|
|
- ).
|
|
|
- ToSlice(&noduplicates)
|
|
|
-
|
|
|
- for _, product := range noduplicates {
|
|
|
- fmt.Printf("%s %d\n", product.Name, product.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // orange 4
|
|
|
- // apple 9
|
|
|
- // lemon 12
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use the Except
|
|
|
-// method to compare two slices of numbers and return elements
|
|
|
-// that appear only in the first slice.
|
|
|
-func ExampleQuery_Except() {
|
|
|
- numbers1 := []float32{2.0, 2.1, 2.2, 2.3, 2.4, 2.5}
|
|
|
- numbers2 := []float32{2.2}
|
|
|
-
|
|
|
- var onlyInFirstSet []float32
|
|
|
- From(numbers1).
|
|
|
- Except(From(numbers2)).
|
|
|
- ToSlice(&onlyInFirstSet)
|
|
|
-
|
|
|
- for _, number := range onlyInFirstSet {
|
|
|
- fmt.Println(number)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- //2
|
|
|
- //2.1
|
|
|
- //2.3
|
|
|
- //2.4
|
|
|
- //2.5
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use the Except
|
|
|
-// method to compare two slices of numbers and return elements
|
|
|
-// that appear only in the first slice.
|
|
|
-func ExampleQuery_ExceptBy() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- fruits1 := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- fruits2 := []Product{
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- //Order and exclude duplicates.
|
|
|
- var except []Product
|
|
|
- From(fruits1).
|
|
|
- ExceptBy(From(fruits2),
|
|
|
- func(item interface{}) interface{} { return item.(Product).Code },
|
|
|
- ).
|
|
|
- ToSlice(&except)
|
|
|
-
|
|
|
- for _, product := range except {
|
|
|
- fmt.Printf("%s %d\n", product.Name, product.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // orange 4
|
|
|
- // lemon 12
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use First
|
|
|
-// to return the first element of an array.
|
|
|
-func ExampleQuery_First() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54, 83, 23, 87, 435, 67, 12, 19}
|
|
|
-
|
|
|
- first := From(numbers).First()
|
|
|
-
|
|
|
- fmt.Println(first)
|
|
|
- // Output:
|
|
|
- // 9
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use FirstWith
|
|
|
-// to return the first element of an array that satisfies a condition.
|
|
|
-func ExampleQuery_FirstWith() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54, 83, 23, 87, 435, 67, 12, 19}
|
|
|
-
|
|
|
- first := From(numbers).
|
|
|
- FirstWith(
|
|
|
- func(item interface{}) bool { return item.(int) > 80 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(first)
|
|
|
- // Output:
|
|
|
- // 92
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use Intersect
|
|
|
-//to return the elements that appear in each of two slices of integers.
|
|
|
-func ExampleQuery_Intersect() {
|
|
|
- id1 := []int{44, 26, 92, 30, 71, 38}
|
|
|
- id2 := []int{39, 59, 83, 47, 26, 4, 30}
|
|
|
-
|
|
|
- var both []int
|
|
|
- From(id1).
|
|
|
- Intersect(From(id2)).
|
|
|
- ToSlice(&both)
|
|
|
-
|
|
|
- for _, id := range both {
|
|
|
- fmt.Println(id)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 26
|
|
|
- // 30
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use IntersectBy
|
|
|
-//to return the elements that appear in each of two slices of products with same Code.
|
|
|
-func ExampleQuery_IntersectBy() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- store1 := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- store2 := []Product{
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- var duplicates []Product
|
|
|
- From(store1).
|
|
|
- IntersectBy(From(store2),
|
|
|
- func(p interface{}) interface{} { return p.(Product).Code },
|
|
|
- ).
|
|
|
- ToSlice(&duplicates)
|
|
|
-
|
|
|
- for _, p := range duplicates {
|
|
|
- fmt.Println(p.Name, "", p.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apple 9
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Last
|
|
|
-// to return the last element of an array.
|
|
|
-func ExampleQuery_Last() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54,
|
|
|
- 83, 23, 87, 67, 12, 19}
|
|
|
-
|
|
|
- last := From(numbers).Last()
|
|
|
-
|
|
|
- fmt.Println(last)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //19
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use LastWith
|
|
|
-// to return the last element of an array.
|
|
|
-func ExampleQuery_LastWith() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54,
|
|
|
- 83, 23, 87, 67, 12, 19}
|
|
|
-
|
|
|
- last := From(numbers).
|
|
|
- LastWith(
|
|
|
- func(n interface{}) bool { return n.(int) > 80 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(last)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //87
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Max
|
|
|
-// to determine the maximum value in a slice.
|
|
|
-func ExampleQuery_Max() {
|
|
|
- numbers := []int64{4294967296, 466855135, 81125}
|
|
|
-
|
|
|
- last := From(numbers).Max()
|
|
|
-
|
|
|
- fmt.Println(last)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //4294967296
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Min
|
|
|
-// to determine the minimum value in a slice.
|
|
|
-func ExampleQuery_Min() {
|
|
|
- grades := []int{78, 92, 99, 37, 81}
|
|
|
-
|
|
|
- min := From(grades).Min()
|
|
|
-
|
|
|
- fmt.Println(min)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //37
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use OrderByDescending
|
|
|
-// to sort the elements of a slice in descending order by using a selector function
|
|
|
-func ExampleQuery_OrderByDescending() {
|
|
|
- names := []string{"Ned", "Ben", "Susan"}
|
|
|
-
|
|
|
- var result []string
|
|
|
- From(names).
|
|
|
- OrderByDescending(
|
|
|
- func(n interface{}) interface{} { return n },
|
|
|
- ).ToSlice(&result)
|
|
|
-
|
|
|
- fmt.Println(result)
|
|
|
- // Output:
|
|
|
- // [Susan Ned Ben]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ThenByDescending to perform
|
|
|
-// a secondary ordering of the elements in a slice in descending order.
|
|
|
-func ExampleOrderedQuery_ThenByDescending() {
|
|
|
- fruits := []string{"apPLe", "baNanA", "apple", "APple", "orange", "BAnana", "ORANGE", "apPLE"}
|
|
|
-
|
|
|
- // Sort the strings first ascending by their length and
|
|
|
- // then descending using a custom case insensitive comparer.
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- OrderBy(
|
|
|
- func(fruit interface{}) interface{} { return len(fruit.(string)) },
|
|
|
- ).
|
|
|
- ThenByDescending(
|
|
|
- func(fruit interface{}) interface{} { return fruit.(string)[0] },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- for _, fruit := range query {
|
|
|
- fmt.Println(fruit)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apPLe
|
|
|
- // apPLE
|
|
|
- // apple
|
|
|
- // APple
|
|
|
- // orange
|
|
|
- // baNanA
|
|
|
- // ORANGE
|
|
|
- // BAnana
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Concat
|
|
|
-// to concatenate two slices.
|
|
|
-func ExampleQuery_Concat() {
|
|
|
- q := From([]int{1, 2, 3}).
|
|
|
- Concat(From([]int{4, 5, 6}))
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [1 2 3 4 5 6]
|
|
|
-}
|
|
|
-
|
|
|
-func ExampleQuery_GroupBy() {
|
|
|
- input := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
|
|
|
-
|
|
|
- q := From(input).GroupBy(
|
|
|
- func(i interface{}) interface{} { return i.(int) % 2 },
|
|
|
- func(i interface{}) interface{} { return i.(int) })
|
|
|
-
|
|
|
- fmt.Println(q.OrderBy(func(i interface{}) interface{} {
|
|
|
- return i.(Group).Key
|
|
|
- }).Results())
|
|
|
- // Output:
|
|
|
- // [{0 [2 4 6 8]} {1 [1 3 5 7 9]}]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use GroupJoin
|
|
|
-// to perform a grouped join on two slices
|
|
|
-func ExampleQuery_GroupJoin() {
|
|
|
- fruits := []string{
|
|
|
- "apple",
|
|
|
- "banana",
|
|
|
- "apricot",
|
|
|
- "cherry",
|
|
|
- "clementine",
|
|
|
- }
|
|
|
-
|
|
|
- q := FromString("abc").
|
|
|
- GroupJoin(From(fruits),
|
|
|
- func(i interface{}) interface{} { return i },
|
|
|
- func(i interface{}) interface{} { return []rune(i.(string))[0] },
|
|
|
- func(outer interface{}, inners []interface{}) interface{} {
|
|
|
- return KeyValue{string(outer.(rune)), inners}
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [{a [apple apricot]} {b [banana]} {c [cherry clementine]}]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use IndexOf
|
|
|
-// to retrieve the position of an item in the array and then
|
|
|
-// update that item.
|
|
|
-func ExampleQuery_IndexOf() {
|
|
|
- type Item struct {
|
|
|
- ID uint64
|
|
|
- Name string
|
|
|
- }
|
|
|
- items := []Item{
|
|
|
- {
|
|
|
- ID: 1,
|
|
|
- Name: "Joe",
|
|
|
- },
|
|
|
- {
|
|
|
- ID: 2,
|
|
|
- Name: "Bob",
|
|
|
- },
|
|
|
- {
|
|
|
- ID: 3,
|
|
|
- Name: "Rickster",
|
|
|
- },
|
|
|
- {
|
|
|
- ID: 4,
|
|
|
- Name: "Jim",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- index := From(items).IndexOf(func(i interface{}) bool {
|
|
|
- item, ok := i.(Item)
|
|
|
- return ok && item.Name == "Rickster"
|
|
|
- })
|
|
|
-
|
|
|
- if index >= 0 {
|
|
|
- // We found the item in the array. Change the name using the index.
|
|
|
- items[index].Name = "Joshua"
|
|
|
- fmt.Println("Item found at:", index, "new name:", items[index].Name)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Item found at: 2 new name: Joshua
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Join
|
|
|
-// to perform an inner join of two slices based on a common key.
|
|
|
-func ExampleQuery_Join() {
|
|
|
- fruits := []string{
|
|
|
- "apple",
|
|
|
- "banana",
|
|
|
- "apricot",
|
|
|
- "cherry",
|
|
|
- "clementine",
|
|
|
- }
|
|
|
-
|
|
|
- q := Range(1, 10).
|
|
|
- Join(From(fruits),
|
|
|
- func(i interface{}) interface{} { return i },
|
|
|
- func(i interface{}) interface{} { return len(i.(string)) },
|
|
|
- func(outer interface{}, inner interface{}) interface{} {
|
|
|
- return KeyValue{outer, inner}
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [{5 apple} {6 banana} {6 cherry} {7 apricot} {10 clementine}]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use OrderBy
|
|
|
-// to sort the elements of a slice.
|
|
|
-func ExampleQuery_OrderBy() {
|
|
|
- q := Range(1, 10).
|
|
|
- OrderBy(
|
|
|
- func(i interface{}) interface{} { return i.(int) % 2 },
|
|
|
- ).
|
|
|
- ThenByDescending(
|
|
|
- func(i interface{}) interface{} { return i },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [10 8 6 4 2 9 7 5 3 1]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Prepend
|
|
|
-// to include an elements in the first position of a slice.
|
|
|
-func ExampleQuery_Prepend() {
|
|
|
- input := []int{2, 3, 4, 5}
|
|
|
-
|
|
|
- q := From(input).Prepend(1)
|
|
|
- first := q.First()
|
|
|
-
|
|
|
- fmt.Println(first)
|
|
|
- // Output:
|
|
|
- // 1
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Reverse
|
|
|
-// to reverse the order of elements in a string.
|
|
|
-func ExampleQuery_Reverse() {
|
|
|
- input := "apple"
|
|
|
-
|
|
|
- var output []rune
|
|
|
- From(input).
|
|
|
- Reverse().
|
|
|
- ToSlice(&output)
|
|
|
-
|
|
|
- fmt.Println(string(output))
|
|
|
- // Output:
|
|
|
- // elppa
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Select
|
|
|
-// to project over a slice of values.
|
|
|
-func ExampleQuery_Select() {
|
|
|
- squares := []int{}
|
|
|
-
|
|
|
- Range(1, 10).
|
|
|
- Select(
|
|
|
- func(x interface{}) interface{} { return x.(int) * x.(int) },
|
|
|
- ).
|
|
|
- ToSlice(&squares)
|
|
|
-
|
|
|
- fmt.Println(squares)
|
|
|
- // Output:
|
|
|
- // [1 4 9 16 25 36 49 64 81 100]
|
|
|
-}
|
|
|
-
|
|
|
-func ExampleQuery_SelectMany() {
|
|
|
- input := [][]int{{1, 2, 3}, {4, 5, 6, 7}}
|
|
|
-
|
|
|
- q := From(input).
|
|
|
- SelectMany(
|
|
|
- func(i interface{}) Query { return From(i) },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [1 2 3 4 5 6 7]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Select
|
|
|
-// to project over a slice of values and use the index of each element.
|
|
|
-func ExampleQuery_SelectIndexed() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- result := []string{}
|
|
|
- From(fruits).
|
|
|
- SelectIndexed(
|
|
|
- func(index int, fruit interface{}) interface{} { return fruit.(string)[:index] },
|
|
|
- ).
|
|
|
- ToSlice(&result)
|
|
|
-
|
|
|
- fmt.Println(result)
|
|
|
- // Output:
|
|
|
- // [ b ma ora pass grape]
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyByIndexed
|
|
|
-// to perform a one-to-many projection over an array and use the index of each outer element.
|
|
|
-func ExampleQuery_SelectManyByIndexed() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- Pets []Pet
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{
|
|
|
- Name: "Hedlund, Magnus",
|
|
|
- Pets: []Pet{{Name: "Daisy"}},
|
|
|
- }
|
|
|
-
|
|
|
- terry := Person{
|
|
|
- Name: "Adams, Terry",
|
|
|
- Pets: []Pet{{Name: "Barley"}, {Name: "Boots"}},
|
|
|
- }
|
|
|
- charlotte := Person{
|
|
|
- Name: "Weiss, Charlotte",
|
|
|
- Pets: []Pet{{Name: "Whiskers"}},
|
|
|
- }
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- var results []string
|
|
|
-
|
|
|
- From(people).
|
|
|
- SelectManyByIndexed(
|
|
|
- func(index int, person interface{}) Query {
|
|
|
- return From(person.(Person).Pets).
|
|
|
- Select(func(pet interface{}) interface{} {
|
|
|
- return fmt.Sprintf("%d - %s", index, pet.(Pet).Name)
|
|
|
- })
|
|
|
- },
|
|
|
- func(indexedPet, person interface{}) interface{} {
|
|
|
- return fmt.Sprintf("Pet: %s, Owner: %s", indexedPet, person.(Person).Name)
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Pet: 0 - Daisy, Owner: Hedlund, Magnus
|
|
|
- // Pet: 1 - Barley, Owner: Adams, Terry
|
|
|
- // Pet: 1 - Boots, Owner: Adams, Terry
|
|
|
- // Pet: 2 - Whiskers, Owner: Weiss, Charlotte
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyIndexed
|
|
|
-// to perform a one-to-many projection over an slice of log data and print out their contents.
|
|
|
-func ExampleQuery_SelectManyIndexed() {
|
|
|
- type LogFile struct {
|
|
|
- Name string
|
|
|
- Lines []string
|
|
|
- }
|
|
|
-
|
|
|
- file1 := LogFile{
|
|
|
- Name: "file1.log",
|
|
|
- Lines: []string{
|
|
|
- "INFO: 2013/11/05 18:11:01 main.go:44: Special Information",
|
|
|
- "WARNING: 2013/11/05 18:11:01 main.go:45: There is something you need to know about",
|
|
|
- "ERROR: 2013/11/05 18:11:01 main.go:46: Something has failed",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- file2 := LogFile{
|
|
|
- Name: "file2.log",
|
|
|
- Lines: []string{
|
|
|
- "INFO: 2013/11/05 18:11:01 main.go:46: Everything is ok",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- file3 := LogFile{
|
|
|
- Name: "file3.log",
|
|
|
- Lines: []string{
|
|
|
- "2013/11/05 18:42:26 Hello World",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- logFiles := []LogFile{file1, file2, file3}
|
|
|
- var results []string
|
|
|
-
|
|
|
- From(logFiles).
|
|
|
- SelectManyIndexedT(func(fileIndex int, file LogFile) Query {
|
|
|
- return From(file.Lines).
|
|
|
- SelectIndexedT(func(lineIndex int, line string) string {
|
|
|
- return fmt.Sprintf("File:[%d] - %s => line: %d - %s", fileIndex+1, file.Name, lineIndex+1, line)
|
|
|
- })
|
|
|
- }).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // File:[1] - file1.log => line: 1 - INFO: 2013/11/05 18:11:01 main.go:44: Special Information
|
|
|
- // File:[1] - file1.log => line: 2 - WARNING: 2013/11/05 18:11:01 main.go:45: There is something you need to know about
|
|
|
- // File:[1] - file1.log => line: 3 - ERROR: 2013/11/05 18:11:01 main.go:46: Something has failed
|
|
|
- // File:[2] - file2.log => line: 1 - INFO: 2013/11/05 18:11:01 main.go:46: Everything is ok
|
|
|
- // File:[3] - file3.log => line: 1 - 2013/11/05 18:42:26 Hello World
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectMany
|
|
|
-// to perform a one-to-many projection over a slice
|
|
|
-func ExampleQuery_SelectManyBy() {
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- Pets []Pet
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{
|
|
|
- Name: "Hedlund, Magnus",
|
|
|
- Pets: []Pet{{Name: "Daisy"}},
|
|
|
- }
|
|
|
-
|
|
|
- terry := Person{
|
|
|
- Name: "Adams, Terry",
|
|
|
- Pets: []Pet{{Name: "Barley"}, {Name: "Boots"}},
|
|
|
- }
|
|
|
- charlotte := Person{
|
|
|
- Name: "Weiss, Charlotte",
|
|
|
- Pets: []Pet{{Name: "Whiskers"}},
|
|
|
- }
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- var results []string
|
|
|
- From(people).
|
|
|
- SelectManyBy(
|
|
|
- func(person interface{}) Query { return From(person.(Person).Pets) },
|
|
|
- func(pet, person interface{}) interface{} {
|
|
|
- return fmt.Sprintf("Owner: %s, Pet: %s", person.(Person).Name, pet.(Pet).Name)
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Owner: Hedlund, Magnus, Pet: Daisy
|
|
|
- // Owner: Adams, Terry, Pet: Barley
|
|
|
- // Owner: Adams, Terry, Pet: Boots
|
|
|
- // Owner: Weiss, Charlotte, Pet: Whiskers
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SequenceEqual
|
|
|
-// to determine whether two slices are equal.
|
|
|
-func ExampleQuery_SequenceEqual() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- }
|
|
|
-
|
|
|
- pets1 := []Pet{
|
|
|
- {Name: "Barley", Age: 8},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 1},
|
|
|
- {Name: "Daisy", Age: 4},
|
|
|
- }
|
|
|
-
|
|
|
- pets2 := []Pet{
|
|
|
- {Name: "Barley", Age: 8},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 1},
|
|
|
- {Name: "Daisy", Age: 4},
|
|
|
- }
|
|
|
-
|
|
|
- equal := From(pets1).SequenceEqual(From(pets2))
|
|
|
-
|
|
|
- fmt.Printf("Are the lists equals? %t", equal)
|
|
|
- // Output:
|
|
|
- // Are the lists equals? true
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Single
|
|
|
-// to select the only element of a slice.
|
|
|
-func ExampleQuery_Single() {
|
|
|
- fruits1 := []string{"orange"}
|
|
|
-
|
|
|
- fruit1 := From(fruits1).Single()
|
|
|
-
|
|
|
- fmt.Println(fruit1)
|
|
|
- // Output:
|
|
|
- // orange
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SingleWith
|
|
|
-// to select the only element of a slice that satisfies a condition.
|
|
|
-func ExampleQuery_SingleWith() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- fruit := From(fruits).
|
|
|
- SingleWith(
|
|
|
- func(f interface{}) bool { return len(f.(string)) > 10 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(fruit)
|
|
|
- // Output:
|
|
|
- // passionfruit
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Skip
|
|
|
-// to skip a specified number of elements in a sorted array
|
|
|
-// and return the remaining elements.
|
|
|
-func ExampleQuery_Skip() {
|
|
|
- grades := []int{59, 82, 70, 56, 92, 98, 85}
|
|
|
- var lowerGrades []int
|
|
|
- From(grades).
|
|
|
- OrderByDescending(
|
|
|
- func(g interface{}) interface{} { return g },
|
|
|
- ).
|
|
|
- Skip(3).
|
|
|
- ToSlice(&lowerGrades)
|
|
|
-
|
|
|
- //All grades except the top three are:
|
|
|
- fmt.Println(lowerGrades)
|
|
|
- // Output:
|
|
|
- // [82 70 59 56]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SkipWhile
|
|
|
-// to skip elements of an array as long as a condition is true.
|
|
|
-func ExampleQuery_SkipWhile() {
|
|
|
- grades := []int{59, 82, 70, 56, 92, 98, 85}
|
|
|
- var lowerGrades []int
|
|
|
- From(grades).
|
|
|
- OrderByDescending(
|
|
|
- func(g interface{}) interface{} { return g },
|
|
|
- ).
|
|
|
- SkipWhile(
|
|
|
- func(g interface{}) bool { return g.(int) >= 80 },
|
|
|
- ).
|
|
|
- ToSlice(&lowerGrades)
|
|
|
-
|
|
|
- // All grades below 80:
|
|
|
- fmt.Println(lowerGrades)
|
|
|
- // Output:
|
|
|
- // [70 59 56]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SkipWhileIndexed
|
|
|
-// to skip elements of an array as long as a condition that depends
|
|
|
-// on the element's index is true.
|
|
|
-func ExampleQuery_SkipWhileIndexed() {
|
|
|
- amounts := []int{5000, 2500, 9000, 8000, 6500, 4000, 1500, 5500}
|
|
|
-
|
|
|
- var query []int
|
|
|
- From(amounts).
|
|
|
- SkipWhileIndexed(
|
|
|
- func(index int, amount interface{}) bool { return amount.(int) > index*1000 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [4000 1500 5500]
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Sort
|
|
|
-// to order elements of an slice.
|
|
|
-func ExampleQuery_Sort() {
|
|
|
- amounts := []int{5000, 2500, 9000, 8000, 6500, 4000, 1500, 5500}
|
|
|
-
|
|
|
- var query []int
|
|
|
- From(amounts).
|
|
|
- Sort(
|
|
|
- func(i interface{}, j interface{}) bool { return i.(int) < j.(int) },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [1500 2500 4000 5000 5500 6500 8000 9000]
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SumFloats
|
|
|
-// to sum the values of a slice.
|
|
|
-func ExampleQuery_SumFloats() {
|
|
|
- numbers := []float64{43.68, 1.25, 583.7, 6.5}
|
|
|
-
|
|
|
- sum := From(numbers).SumFloats()
|
|
|
-
|
|
|
- fmt.Printf("The sum of the numbers is %f.", sum)
|
|
|
- // Output:
|
|
|
- // The sum of the numbers is 635.130000.
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SumInts
|
|
|
-// to sum the values of a slice.
|
|
|
-func ExampleQuery_SumInts() {
|
|
|
- numbers := []int{43, 1, 583, 6}
|
|
|
-
|
|
|
- sum := From(numbers).SumInts()
|
|
|
-
|
|
|
- fmt.Printf("The sum of the numbers is %d.", sum)
|
|
|
- // Output:
|
|
|
- // The sum of the numbers is 633.
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SumUInts
|
|
|
-// to sum the values of a slice.
|
|
|
-func ExampleQuery_SumUInts() {
|
|
|
- numbers := []uint{43, 1, 583, 6}
|
|
|
-
|
|
|
- sum := From(numbers).SumUInts()
|
|
|
-
|
|
|
- fmt.Printf("The sum of the numbers is %d.", sum)
|
|
|
- // Output:
|
|
|
- // The sum of the numbers is 633.
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Take
|
|
|
-// to return elements from the start of a slice.
|
|
|
-func ExampleQuery_Take() {
|
|
|
- grades := []int{59, 82, 70, 56, 92, 98, 85}
|
|
|
-
|
|
|
- var topThreeGrades []int
|
|
|
- From(grades).
|
|
|
- OrderByDescending(
|
|
|
- func(grade interface{}) interface{} { return grade },
|
|
|
- ).
|
|
|
- Take(3).
|
|
|
- ToSlice(&topThreeGrades)
|
|
|
-
|
|
|
- fmt.Printf("The top three grades are: %v", topThreeGrades)
|
|
|
- // Output:
|
|
|
- // The top three grades are: [98 92 85]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use TakeWhile
|
|
|
-// to return elements from the start of a slice.
|
|
|
-func ExampleQuery_TakeWhile() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- TakeWhile(
|
|
|
- func(fruit interface{}) bool { return fruit.(string) != "orange" },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [apple banana mango]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use TakeWhileIndexed
|
|
|
-// to return elements from the start of a slice as long as
|
|
|
-// a condition that uses the element's index is true.
|
|
|
-func ExampleQuery_TakeWhileIndexed() {
|
|
|
-
|
|
|
- fruits := []string{"apple", "passionfruit", "banana", "mango",
|
|
|
- "orange", "blueberry", "grape", "strawberry"}
|
|
|
-
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- TakeWhileIndexed(
|
|
|
- func(index int, fruit interface{}) bool { return len(fruit.(string)) >= index },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [apple passionfruit banana mango orange blueberry]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToChannel
|
|
|
-// to send a slice to a channel.
|
|
|
-func ExampleQuery_ToChannel() {
|
|
|
- c := make(chan interface{})
|
|
|
-
|
|
|
- go func() {
|
|
|
- Repeat(10, 3).ToChannel(c)
|
|
|
- }()
|
|
|
-
|
|
|
- for i := range c {
|
|
|
- fmt.Println(i)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 10
|
|
|
- // 10
|
|
|
- // 10
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToChannelT
|
|
|
-// to send a slice to a typed channel.
|
|
|
-func ExampleQuery_ToChannelT() {
|
|
|
- c := make(chan string)
|
|
|
-
|
|
|
- go Repeat("ten", 3).ToChannelT(c)
|
|
|
-
|
|
|
- for i := range c {
|
|
|
- fmt.Println(i)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // ten
|
|
|
- // ten
|
|
|
- // ten
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToMap to populate a map.
|
|
|
-func ExampleQuery_ToMap() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- products := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- map1 := map[int]string{}
|
|
|
- From(products).
|
|
|
- SelectT(
|
|
|
- func(item Product) KeyValue { return KeyValue{Key: item.Code, Value: item.Name} },
|
|
|
- ).
|
|
|
- ToMap(&map1)
|
|
|
-
|
|
|
- fmt.Println(map1[4])
|
|
|
- fmt.Println(map1[9])
|
|
|
- fmt.Println(map1[12])
|
|
|
- // Output:
|
|
|
- // orange
|
|
|
- // apple
|
|
|
- // lemon
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToMapBy
|
|
|
-// by using a key and value selectors to populate a map.
|
|
|
-func ExampleQuery_ToMapBy() {
|
|
|
- input := [][]interface{}{{1, true}}
|
|
|
-
|
|
|
- result := make(map[int]bool)
|
|
|
- From(input).
|
|
|
- ToMapBy(&result,
|
|
|
- func(i interface{}) interface{} {
|
|
|
- return i.([]interface{})[0]
|
|
|
- },
|
|
|
- func(i interface{}) interface{} {
|
|
|
- return i.([]interface{})[1]
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(result)
|
|
|
- // Output:
|
|
|
- // map[1:true]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToSlice to populate a slice.
|
|
|
-func ExampleQuery_ToSlice() {
|
|
|
- var result []int
|
|
|
- Range(1, 10).ToSlice(&result)
|
|
|
-
|
|
|
- fmt.Println(result)
|
|
|
- // Output:
|
|
|
- // [1 2 3 4 5 6 7 8 9 10]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Union
|
|
|
-// to obtain the union of two slices of integers.
|
|
|
-func ExampleQuery_Union() {
|
|
|
- q := Range(1, 10).Union(Range(6, 10))
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use Where
|
|
|
-// to filter a slices.
|
|
|
-func ExampleQuery_Where() {
|
|
|
- fruits := []string{"apple", "passionfruit", "banana", "mango",
|
|
|
- "orange", "blueberry", "grape", "strawberry"}
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- Where(
|
|
|
- func(f interface{}) bool { return len(f.(string)) > 6 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [passionfruit blueberry strawberry]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use WhereIndexed
|
|
|
-// to filter a slice based on a predicate that involves the index of each element.
|
|
|
-func ExampleQuery_WhereIndexed() {
|
|
|
- numbers := []int{0, 30, 20, 15, 90, 85, 40, 75}
|
|
|
-
|
|
|
- var query []int
|
|
|
- From(numbers).
|
|
|
- WhereIndexed(
|
|
|
- func(index int, number interface{}) bool { return number.(int) <= index*10 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [0 20 15 40]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use the Zip
|
|
|
-// method to merge two slices.
|
|
|
-func ExampleQuery_Zip() {
|
|
|
- number := []int{1, 2, 3, 4, 5}
|
|
|
- words := []string{"one", "two", "three"}
|
|
|
-
|
|
|
- q := From(number).
|
|
|
- Zip(From(words),
|
|
|
- func(a interface{}, b interface{}) interface{} { return []interface{}{a, b} },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [[1 one] [2 two] [3 three]]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ThenByDescendingT to perform
|
|
|
-// a order in a slice of dates by year, and then by month descending.
|
|
|
-func ExampleOrderedQuery_ThenByDescendingT() {
|
|
|
- dates := []time.Time{
|
|
|
- time.Date(2015, 3, 23, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2014, 7, 11, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2013, 5, 4, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2015, 1, 2, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2015, 7, 10, 0, 0, 0, 0, time.Local),
|
|
|
- }
|
|
|
-
|
|
|
- var orderedDates []time.Time
|
|
|
- From(dates).
|
|
|
- OrderByT(
|
|
|
- func(date time.Time) int {
|
|
|
- return date.Year()
|
|
|
- }).
|
|
|
- ThenByDescendingT(
|
|
|
- func(date time.Time) int { return int(date.Month()) },
|
|
|
- ).
|
|
|
- ToSlice(&orderedDates)
|
|
|
-
|
|
|
- for _, date := range orderedDates {
|
|
|
- fmt.Println(date.Format("2006-Jan-02"))
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 2013-May-04
|
|
|
- // 2014-Jul-11
|
|
|
- // 2015-Jul-10
|
|
|
- // 2015-Mar-23
|
|
|
- // 2015-Jan-02
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ThenByT to perform
|
|
|
-// a orders in a slice of dates by year, and then by day.
|
|
|
-func ExampleOrderedQuery_ThenByT() {
|
|
|
- dates := []time.Time{
|
|
|
- time.Date(2015, 3, 23, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2014, 7, 11, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2013, 5, 4, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2015, 1, 2, 0, 0, 0, 0, time.Local),
|
|
|
- time.Date(2015, 7, 10, 0, 0, 0, 0, time.Local),
|
|
|
- }
|
|
|
-
|
|
|
- var orderedDates []time.Time
|
|
|
- From(dates).
|
|
|
- OrderByT(
|
|
|
- func(date time.Time) int { return date.Year() },
|
|
|
- ).
|
|
|
- ThenByT(
|
|
|
- func(date time.Time) int { return int(date.Day()) },
|
|
|
- ).
|
|
|
- ToSlice(&orderedDates)
|
|
|
-
|
|
|
- for _, date := range orderedDates {
|
|
|
- fmt.Println(date.Format("2006-Jan-02"))
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 2013-May-04
|
|
|
- // 2014-Jul-11
|
|
|
- // 2015-Jan-02
|
|
|
- // 2015-Jul-10
|
|
|
- // 2015-Mar-23
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to reverse
|
|
|
-// the order of words in a string using AggregateT.
|
|
|
-func ExampleQuery_AggregateT() {
|
|
|
- sentence := "the quick brown fox jumps over the lazy dog"
|
|
|
- // Split the string into individual words.
|
|
|
- words := strings.Split(sentence, " ")
|
|
|
-
|
|
|
- // Prepend each word to the beginning of the
|
|
|
- // new sentence to reverse the word order.
|
|
|
- reversed := From(words).AggregateT(
|
|
|
- func(workingSentence string, next string) string { return next + " " + workingSentence },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(reversed)
|
|
|
- // Output:
|
|
|
- // dog lazy the over jumps fox brown quick the
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AggregateWithSeed function
|
|
|
-func ExampleQuery_AggregateWithSeedT() {
|
|
|
-
|
|
|
- fruits := []string{"apple", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- // Determine whether any string in the array is longer than "banana".
|
|
|
- longestName := From(fruits).
|
|
|
- AggregateWithSeedT("banana",
|
|
|
- func(longest, next string) string {
|
|
|
- if len(next) > len(longest) {
|
|
|
- return next
|
|
|
- }
|
|
|
- return longest
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Printf("The fruit with the longest name is %s.", longestName)
|
|
|
- // Output:
|
|
|
- // The fruit with the longest name is passionfruit.
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AggregateWithSeedByT function
|
|
|
-func ExampleQuery_AggregateWithSeedByT() {
|
|
|
- input := []string{"apple", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- // Determine whether any string in the array is longer than "banana".
|
|
|
- longestName := From(input).AggregateWithSeedByT("banana",
|
|
|
- func(longest string, next string) string {
|
|
|
- if len(longest) > len(next) {
|
|
|
- return longest
|
|
|
- }
|
|
|
- return next
|
|
|
-
|
|
|
- },
|
|
|
- // Return the final result
|
|
|
- func(result string) string {
|
|
|
- return fmt.Sprintf("The fruit with the longest name is %s.", result)
|
|
|
- },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(longestName)
|
|
|
- // Output:
|
|
|
- // The fruit with the longest name is passionfruit.
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AllT
|
|
|
-// to get the students having all marks greater than 70.
|
|
|
-func ExampleQuery_AllT() {
|
|
|
-
|
|
|
- type Student struct {
|
|
|
- Name string
|
|
|
- Marks []int
|
|
|
- }
|
|
|
-
|
|
|
- students := []Student{
|
|
|
- {Name: "Hugo", Marks: []int{91, 88, 76, 93}},
|
|
|
- {Name: "Rick", Marks: []int{70, 73, 66, 90}},
|
|
|
- {Name: "Michael", Marks: []int{73, 80, 75, 88}},
|
|
|
- {Name: "Fadi", Marks: []int{82, 75, 66, 84}},
|
|
|
- {Name: "Peter", Marks: []int{67, 78, 70, 82}},
|
|
|
- }
|
|
|
-
|
|
|
- var approvedStudents []Student
|
|
|
- From(students).
|
|
|
- WhereT(
|
|
|
- func(student Student) bool {
|
|
|
- return From(student.Marks).
|
|
|
- AllT(
|
|
|
- func(mark int) bool { return mark > 70 },
|
|
|
- )
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&approvedStudents)
|
|
|
-
|
|
|
- //List of approved students
|
|
|
- for _, student := range approvedStudents {
|
|
|
- fmt.Println(student.Name)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Hugo
|
|
|
- // Michael
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use AnyWithT
|
|
|
-// to get the students with any mark lower than 70.
|
|
|
-func ExampleQuery_AnyWithT() {
|
|
|
- type Student struct {
|
|
|
- Name string
|
|
|
- Marks []int
|
|
|
- }
|
|
|
-
|
|
|
- students := []Student{
|
|
|
- {Name: "Hugo", Marks: []int{91, 88, 76, 93}},
|
|
|
- {Name: "Rick", Marks: []int{70, 73, 66, 90}},
|
|
|
- {Name: "Michael", Marks: []int{73, 80, 75, 88}},
|
|
|
- {Name: "Fadi", Marks: []int{82, 75, 66, 84}},
|
|
|
- {Name: "Peter", Marks: []int{67, 78, 70, 82}},
|
|
|
- }
|
|
|
-
|
|
|
- var studentsWithAnyMarkLt70 []Student
|
|
|
- From(students).
|
|
|
- WhereT(
|
|
|
- func(student Student) bool {
|
|
|
- return From(student.Marks).
|
|
|
- AnyWithT(
|
|
|
- func(mark int) bool { return mark < 70 },
|
|
|
- )
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&studentsWithAnyMarkLt70)
|
|
|
-
|
|
|
- //List of students with any mark lower than 70
|
|
|
- for _, student := range studentsWithAnyMarkLt70 {
|
|
|
- fmt.Println(student.Name)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Rick
|
|
|
- // Fadi
|
|
|
- // Peter
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use CountWithT
|
|
|
-// to count the elements in an slice that satisfy a condition.
|
|
|
-func ExampleQuery_CountWithT() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Vaccinated bool
|
|
|
- }
|
|
|
-
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Vaccinated: true},
|
|
|
- {Name: "Boots", Vaccinated: false},
|
|
|
- {Name: "Whiskers", Vaccinated: false},
|
|
|
- }
|
|
|
-
|
|
|
- numberUnvaccinated := From(pets).
|
|
|
- CountWithT(
|
|
|
- func(p Pet) bool { return p.Vaccinated == false },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Printf("There are %d unvaccinated animals.", numberUnvaccinated)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //There are 2 unvaccinated animals.
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use DistinctByT
|
|
|
-// to return distinct elements from a slice of structs.
|
|
|
-func ExampleQuery_DistinctByT() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- products := []Product{
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- }
|
|
|
-
|
|
|
- //Exclude duplicates.
|
|
|
- var noduplicates []Product
|
|
|
- From(products).
|
|
|
- DistinctByT(
|
|
|
- func(item Product) int { return item.Code },
|
|
|
- ).
|
|
|
- ToSlice(&noduplicates)
|
|
|
-
|
|
|
- for _, product := range noduplicates {
|
|
|
- fmt.Printf("%s %d\n", product.Name, product.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apple 9
|
|
|
- // orange 4
|
|
|
- // lemon 12
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ExceptByT
|
|
|
-func ExampleQuery_ExceptByT() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- fruits1 := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- fruits2 := []Product{
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- //Order and exclude duplicates.
|
|
|
- var except []Product
|
|
|
- From(fruits1).
|
|
|
- ExceptByT(From(fruits2),
|
|
|
- func(item Product) int { return item.Code },
|
|
|
- ).
|
|
|
- ToSlice(&except)
|
|
|
-
|
|
|
- for _, product := range except {
|
|
|
- fmt.Printf("%s %d\n", product.Name, product.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // orange 4
|
|
|
- // lemon 12
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use FirstWithT
|
|
|
-// to return the first element of an array that satisfies a condition.
|
|
|
-func ExampleQuery_FirstWithT() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54, 83, 23, 87, 435, 67, 12, 19}
|
|
|
-
|
|
|
- first := From(numbers).
|
|
|
- FirstWithT(
|
|
|
- func(item int) bool { return item > 80 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(first)
|
|
|
- // Output:
|
|
|
- // 92
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ForEach
|
|
|
-// to output all elements of an array.
|
|
|
-func ExampleQuery_ForEach() {
|
|
|
- fruits := []string{"orange", "apple", "lemon", "apple"}
|
|
|
-
|
|
|
- From(fruits).ForEach(func(fruit interface{}) {
|
|
|
- fmt.Println(fruit)
|
|
|
- })
|
|
|
- // Output:
|
|
|
- // orange
|
|
|
- // apple
|
|
|
- // lemon
|
|
|
- // apple
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ForEachIndexed
|
|
|
-// to output all elements of an array with its index.
|
|
|
-func ExampleQuery_ForEachIndexed() {
|
|
|
- fruits := []string{"orange", "apple", "lemon", "apple"}
|
|
|
-
|
|
|
- From(fruits).ForEachIndexed(func(i int, fruit interface{}) {
|
|
|
- fmt.Printf("%d.%s\n", i, fruit)
|
|
|
- })
|
|
|
- // Output:
|
|
|
- // 0.orange
|
|
|
- // 1.apple
|
|
|
- // 2.lemon
|
|
|
- // 3.apple
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ForEachT
|
|
|
-// to output all elements of an array.
|
|
|
-func ExampleQuery_ForEachT() {
|
|
|
- fruits := []string{"orange", "apple", "lemon", "apple"}
|
|
|
-
|
|
|
- From(fruits).ForEachT(func(fruit string) {
|
|
|
- fmt.Println(fruit)
|
|
|
- })
|
|
|
- // Output:
|
|
|
- // orange
|
|
|
- // apple
|
|
|
- // lemon
|
|
|
- // apple
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ForEachIndexedT
|
|
|
-// to output all elements of an array with its index.
|
|
|
-func ExampleQuery_ForEachIndexedT() {
|
|
|
- fruits := []string{"orange", "apple", "lemon", "apple"}
|
|
|
-
|
|
|
- From(fruits).ForEachIndexedT(func(i int, fruit string) {
|
|
|
- fmt.Printf("%d.%s\n", i, fruit)
|
|
|
- })
|
|
|
- // Output:
|
|
|
- // 0.orange
|
|
|
- // 1.apple
|
|
|
- // 2.lemon
|
|
|
- // 3.apple
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use GroupByT
|
|
|
-// to group the elements of a slice.
|
|
|
-func ExampleQuery_GroupByT() {
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- }
|
|
|
- // Create a list of pets.
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Age: 8},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 1},
|
|
|
- {Name: "Daisy", Age: 4},
|
|
|
- }
|
|
|
-
|
|
|
- // Group the pets using Age as the key value
|
|
|
- // and selecting only the pet's Name for each value.
|
|
|
- var query []Group
|
|
|
- From(pets).GroupByT(
|
|
|
- func(p Pet) int { return p.Age },
|
|
|
- func(p Pet) string { return p.Name },
|
|
|
- ).OrderByT(
|
|
|
- func(g Group) int { return g.Key.(int) },
|
|
|
- ).ToSlice(&query)
|
|
|
-
|
|
|
- for _, petGroup := range query {
|
|
|
- fmt.Printf("%d\n", petGroup.Key)
|
|
|
- for _, petName := range petGroup.Group {
|
|
|
- fmt.Printf(" %s\n", petName)
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // 1
|
|
|
- // Whiskers
|
|
|
- // 4
|
|
|
- // Boots
|
|
|
- // Daisy
|
|
|
- // 8
|
|
|
- // Barley
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use GroupJoinT
|
|
|
-// to perform a grouped join on two slices.
|
|
|
-func ExampleQuery_GroupJoinT() {
|
|
|
-
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Owner Person
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{Name: "Hedlund, Magnus"}
|
|
|
- terry := Person{Name: "Adams, Terry"}
|
|
|
- charlotte := Person{Name: "Weiss, Charlotte"}
|
|
|
-
|
|
|
- barley := Pet{Name: "Barley", Owner: terry}
|
|
|
- boots := Pet{Name: "Boots", Owner: terry}
|
|
|
- whiskers := Pet{Name: "Whiskers", Owner: charlotte}
|
|
|
- daisy := Pet{Name: "Daisy", Owner: magnus}
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- pets := []Pet{barley, boots, whiskers, daisy}
|
|
|
-
|
|
|
- // Create a slice where each element is a KeyValue
|
|
|
- // that contains a person's name as the key and a slice of strings
|
|
|
- // of names of the pets they own as a value.
|
|
|
-
|
|
|
- q := []KeyValue{}
|
|
|
- From(people).
|
|
|
- GroupJoinT(From(pets),
|
|
|
- func(p Person) Person { return p },
|
|
|
- func(p Pet) Person { return p.Owner },
|
|
|
- func(person Person, pets []Pet) KeyValue {
|
|
|
- var petNames []string
|
|
|
- From(pets).
|
|
|
- SelectT(
|
|
|
- func(pet Pet) string { return pet.Name },
|
|
|
- ).
|
|
|
- ToSlice(&petNames)
|
|
|
- return KeyValue{person.Name, petNames}
|
|
|
- },
|
|
|
- ).ToSlice(&q)
|
|
|
-
|
|
|
- for _, obj := range q {
|
|
|
- // Output the owner's name.
|
|
|
- fmt.Printf("%s:\n", obj.Key)
|
|
|
- // Output each of the owner's pet's names.
|
|
|
- for _, petName := range obj.Value.([]string) {
|
|
|
- fmt.Printf(" %s\n", petName)
|
|
|
- }
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Hedlund, Magnus:
|
|
|
- // Daisy
|
|
|
- // Adams, Terry:
|
|
|
- // Barley
|
|
|
- // Boots
|
|
|
- // Weiss, Charlotte:
|
|
|
- // Whiskers
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use IntersectByT
|
|
|
-// to return the elements that appear in each of two slices of products
|
|
|
-// with same Code.
|
|
|
-func ExampleQuery_IntersectByT() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- store1 := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- store2 := []Product{
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- var duplicates []Product
|
|
|
- From(store1).
|
|
|
- IntersectByT(From(store2),
|
|
|
- func(p Product) int { return p.Code },
|
|
|
- ).
|
|
|
- ToSlice(&duplicates)
|
|
|
-
|
|
|
- for _, p := range duplicates {
|
|
|
- fmt.Println(p.Name, "", p.Code)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // apple 9
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use JoinT
|
|
|
-// to perform an inner join of two slices based on a common key.
|
|
|
-func ExampleQuery_JoinT() {
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Owner Person
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{Name: "Hedlund, Magnus"}
|
|
|
- terry := Person{Name: "Adams, Terry"}
|
|
|
- charlotte := Person{Name: "Weiss, Charlotte"}
|
|
|
-
|
|
|
- barley := Pet{Name: "Barley", Owner: terry}
|
|
|
- boots := Pet{Name: "Boots", Owner: terry}
|
|
|
- whiskers := Pet{Name: "Whiskers", Owner: charlotte}
|
|
|
- daisy := Pet{Name: "Daisy", Owner: magnus}
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- pets := []Pet{barley, boots, whiskers, daisy}
|
|
|
-
|
|
|
- // Create a list of Person-Pet pairs where
|
|
|
- // each element is an anonymous type that contains a
|
|
|
- // Pet's name and the name of the Person that owns the Pet.
|
|
|
-
|
|
|
- query := []string{}
|
|
|
- From(people).
|
|
|
- JoinT(From(pets),
|
|
|
- func(person Person) Person { return person },
|
|
|
- func(pet Pet) Person { return pet.Owner },
|
|
|
- func(person Person, pet Pet) string { return fmt.Sprintf("%s - %s", person.Name, pet.Name) },
|
|
|
- ).ToSlice(&query)
|
|
|
-
|
|
|
- for _, line := range query {
|
|
|
- fmt.Println(line)
|
|
|
- }
|
|
|
- //Output:
|
|
|
- //Hedlund, Magnus - Daisy
|
|
|
- //Adams, Terry - Barley
|
|
|
- //Adams, Terry - Boots
|
|
|
- //Weiss, Charlotte - Whiskers
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use LastWithT
|
|
|
-// to return the last element of an array.
|
|
|
-func ExampleQuery_LastWithT() {
|
|
|
- numbers := []int{9, 34, 65, 92, 87, 435, 3, 54,
|
|
|
- 83, 23, 87, 67, 12, 19}
|
|
|
-
|
|
|
- last := From(numbers).
|
|
|
- LastWithT(
|
|
|
- func(n int) bool { return n > 80 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(last)
|
|
|
-
|
|
|
- //Output:
|
|
|
- //87
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use OrderByDescendingT
|
|
|
-// to order an slice.
|
|
|
-func ExampleQuery_OrderByDescendingT() {
|
|
|
- type Player struct {
|
|
|
- Name string
|
|
|
- Points int64
|
|
|
- }
|
|
|
-
|
|
|
- players := []Player{
|
|
|
- {Name: "Hugo", Points: 4757},
|
|
|
- {Name: "Rick", Points: 7365},
|
|
|
- {Name: "Michael", Points: 2857},
|
|
|
- {Name: "Fadi", Points: 85897},
|
|
|
- {Name: "Peter", Points: 48576},
|
|
|
- }
|
|
|
-
|
|
|
- //Order and get the top 3 players
|
|
|
- var top3Players []KeyValue
|
|
|
- From(players).
|
|
|
- OrderByDescendingT(
|
|
|
- func(p Player) int64 { return p.Points },
|
|
|
- ).
|
|
|
- Take(3).
|
|
|
- SelectIndexedT(
|
|
|
- func(i int, p Player) KeyValue { return KeyValue{Key: i + 1, Value: p} },
|
|
|
- ).
|
|
|
- ToSlice(&top3Players)
|
|
|
-
|
|
|
- for _, rank := range top3Players {
|
|
|
- fmt.Printf(
|
|
|
- "Rank: #%d - Player: %s - Points: %d\n",
|
|
|
- rank.Key,
|
|
|
- rank.Value.(Player).Name,
|
|
|
- rank.Value.(Player).Points,
|
|
|
- )
|
|
|
-
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Rank: #1 - Player: Fadi - Points: 85897
|
|
|
- // Rank: #2 - Player: Peter - Points: 48576
|
|
|
- // Rank: #3 - Player: Rick - Points: 7365
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use OrderByT
|
|
|
-// to sort the elements of a slice.
|
|
|
-func ExampleQuery_OrderByT() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- }
|
|
|
- // Create a list of pets.
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Age: 8},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 1},
|
|
|
- {Name: "Daisy", Age: 4},
|
|
|
- }
|
|
|
-
|
|
|
- var orderedPets []Pet
|
|
|
- From(pets).
|
|
|
- OrderByT(
|
|
|
- func(pet Pet) int { return pet.Age },
|
|
|
- ).
|
|
|
- ToSlice(&orderedPets)
|
|
|
-
|
|
|
- for _, pet := range orderedPets {
|
|
|
- fmt.Println(pet.Name, "-", pet.Age)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Whiskers - 1
|
|
|
- // Boots - 4
|
|
|
- // Daisy - 4
|
|
|
- // Barley - 8
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectT
|
|
|
-// to project over a slice.
|
|
|
-func ExampleQuery_SelectT() {
|
|
|
- squares := []int{}
|
|
|
-
|
|
|
- Range(1, 10).
|
|
|
- SelectT(
|
|
|
- func(x int) int { return x * x },
|
|
|
- ).
|
|
|
- ToSlice(&squares)
|
|
|
-
|
|
|
- fmt.Println(squares)
|
|
|
- // Output:
|
|
|
- // [1 4 9 16 25 36 49 64 81 100]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectIndexedT
|
|
|
-// to determine if the value in a slice of int match their position
|
|
|
-// in the slice.
|
|
|
-func ExampleQuery_SelectIndexedT() {
|
|
|
- numbers := []int{5, 4, 1, 3, 9, 8, 6, 7, 2, 0}
|
|
|
-
|
|
|
- var numsInPlace []KeyValue
|
|
|
-
|
|
|
- From(numbers).
|
|
|
- SelectIndexedT(
|
|
|
- func(index, num int) KeyValue { return KeyValue{Key: num, Value: num == index} },
|
|
|
- ).
|
|
|
- ToSlice(&numsInPlace)
|
|
|
-
|
|
|
- fmt.Println("Number: In-place?")
|
|
|
- for _, n := range numsInPlace {
|
|
|
- fmt.Printf("%d: %t\n", n.Key, n.Value)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Number: In-place?
|
|
|
- // 5: false
|
|
|
- // 4: false
|
|
|
- // 1: false
|
|
|
- // 3: true
|
|
|
- // 9: false
|
|
|
- // 8: false
|
|
|
- // 6: true
|
|
|
- // 7: true
|
|
|
- // 2: false
|
|
|
- // 0: false
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyT
|
|
|
-// to perform a one-to-many projection over a slice
|
|
|
-func ExampleQuery_SelectManyByT() {
|
|
|
-
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- Pets []Pet
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{
|
|
|
- Name: "Hedlund, Magnus",
|
|
|
- Pets: []Pet{{Name: "Daisy"}},
|
|
|
- }
|
|
|
-
|
|
|
- terry := Person{
|
|
|
- Name: "Adams, Terry",
|
|
|
- Pets: []Pet{{Name: "Barley"}, {Name: "Boots"}},
|
|
|
- }
|
|
|
- charlotte := Person{
|
|
|
- Name: "Weiss, Charlotte",
|
|
|
- Pets: []Pet{{Name: "Whiskers"}},
|
|
|
- }
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- var results []string
|
|
|
- From(people).
|
|
|
- SelectManyByT(
|
|
|
- func(person Person) Query { return From(person.Pets) },
|
|
|
- func(pet Pet, person Person) interface{} {
|
|
|
- return fmt.Sprintf("Owner: %s, Pet: %s", person.Name, pet.Name)
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Owner: Hedlund, Magnus, Pet: Daisy
|
|
|
- // Owner: Adams, Terry, Pet: Barley
|
|
|
- // Owner: Adams, Terry, Pet: Boots
|
|
|
- // Owner: Weiss, Charlotte, Pet: Whiskers
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyT
|
|
|
-// to perform a projection over a list of sentences and rank the
|
|
|
-// top 5 most used words
|
|
|
-func ExampleQuery_SelectManyT() {
|
|
|
- sentences := []string{
|
|
|
- "the quick brown fox jumps over the lazy dog",
|
|
|
- "pack my box with five dozen liquor jugs",
|
|
|
- "several fabulous dixieland jazz groups played with quick tempo",
|
|
|
- "back in my quaint garden jaunty zinnias vie with flaunting phlox",
|
|
|
- "five or six big jet planes zoomed quickly by the new tower",
|
|
|
- "I quickly explained that many big jobs involve few hazards",
|
|
|
- "The wizard quickly jinxed the gnomes before they vaporized",
|
|
|
- }
|
|
|
-
|
|
|
- var results []string
|
|
|
- From(sentences).
|
|
|
- //Split the sentences in words
|
|
|
- SelectManyT(func(sentence string) Query {
|
|
|
- return From(strings.Split(sentence, " "))
|
|
|
- }).
|
|
|
- //Grouping by word
|
|
|
- GroupByT(
|
|
|
- func(word string) string { return word },
|
|
|
- func(word string) string { return word },
|
|
|
- ).
|
|
|
- //Ordering by word counts
|
|
|
- OrderByDescendingT(func(wordGroup Group) int {
|
|
|
- return len(wordGroup.Group)
|
|
|
- }).
|
|
|
- //Then order by word
|
|
|
- ThenByT(func(wordGroup Group) string {
|
|
|
- return wordGroup.Key.(string)
|
|
|
- }).
|
|
|
- //Take the top 5
|
|
|
- Take(5).
|
|
|
- //Project the words using the index as rank
|
|
|
- SelectIndexedT(func(index int, wordGroup Group) string {
|
|
|
- return fmt.Sprintf("Rank: #%d, Word: %s, Counts: %d", index+1, wordGroup.Key, len(wordGroup.Group))
|
|
|
- }).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Rank: #1, Word: the, Counts: 4
|
|
|
- // Rank: #2, Word: quickly, Counts: 3
|
|
|
- // Rank: #3, Word: with, Counts: 3
|
|
|
- // Rank: #4, Word: big, Counts: 2
|
|
|
- // Rank: #5, Word: five, Counts: 2
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyIndexedT
|
|
|
-// to perform a one-to-many projection over an slice of log files and
|
|
|
-// print out their contents.
|
|
|
-func ExampleQuery_SelectManyIndexedT() {
|
|
|
- type LogFile struct {
|
|
|
- Name string
|
|
|
- Lines []string
|
|
|
- }
|
|
|
-
|
|
|
- file1 := LogFile{
|
|
|
- Name: "file1.log",
|
|
|
- Lines: []string{
|
|
|
- "INFO: 2013/11/05 18:11:01 main.go:44: Special Information",
|
|
|
- "WARNING: 2013/11/05 18:11:01 main.go:45: There is something you need to know about",
|
|
|
- "ERROR: 2013/11/05 18:11:01 main.go:46: Something has failed",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- file2 := LogFile{
|
|
|
- Name: "file2.log",
|
|
|
- Lines: []string{
|
|
|
- "INFO: 2013/11/05 18:11:01 main.go:46: Everything is ok",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- file3 := LogFile{
|
|
|
- Name: "file3.log",
|
|
|
- Lines: []string{
|
|
|
- "2013/11/05 18:42:26 Hello World",
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- logFiles := []LogFile{file1, file2, file3}
|
|
|
- var results []string
|
|
|
-
|
|
|
- From(logFiles).
|
|
|
- SelectManyIndexedT(func(fileIndex int, file LogFile) Query {
|
|
|
- return From(file.Lines).
|
|
|
- SelectIndexedT(func(lineIndex int, line string) string {
|
|
|
- return fmt.Sprintf("File:[%d] - %s => line: %d - %s", fileIndex+1, file.Name, lineIndex+1, line)
|
|
|
- })
|
|
|
- }).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // File:[1] - file1.log => line: 1 - INFO: 2013/11/05 18:11:01 main.go:44: Special Information
|
|
|
- // File:[1] - file1.log => line: 2 - WARNING: 2013/11/05 18:11:01 main.go:45: There is something you need to know about
|
|
|
- // File:[1] - file1.log => line: 3 - ERROR: 2013/11/05 18:11:01 main.go:46: Something has failed
|
|
|
- // File:[2] - file2.log => line: 1 - INFO: 2013/11/05 18:11:01 main.go:46: Everything is ok
|
|
|
- // File:[3] - file3.log => line: 1 - 2013/11/05 18:42:26 Hello World
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SelectManyByIndexedT
|
|
|
-// to perform a one-to-many projection over an array and use the index of
|
|
|
-// each outer element.
|
|
|
-func ExampleQuery_SelectManyByIndexedT() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- }
|
|
|
-
|
|
|
- type Person struct {
|
|
|
- Name string
|
|
|
- Pets []Pet
|
|
|
- }
|
|
|
-
|
|
|
- magnus := Person{
|
|
|
- Name: "Hedlund, Magnus",
|
|
|
- Pets: []Pet{{Name: "Daisy"}},
|
|
|
- }
|
|
|
-
|
|
|
- terry := Person{
|
|
|
- Name: "Adams, Terry",
|
|
|
- Pets: []Pet{{Name: "Barley"}, {Name: "Boots"}},
|
|
|
- }
|
|
|
- charlotte := Person{
|
|
|
- Name: "Weiss, Charlotte",
|
|
|
- Pets: []Pet{{Name: "Whiskers"}},
|
|
|
- }
|
|
|
-
|
|
|
- people := []Person{magnus, terry, charlotte}
|
|
|
- var results []string
|
|
|
-
|
|
|
- From(people).
|
|
|
- SelectManyByIndexedT(
|
|
|
- func(index int, person Person) Query {
|
|
|
- return From(person.Pets).
|
|
|
- SelectT(func(pet Pet) string {
|
|
|
- return fmt.Sprintf("%d - %s", index, pet.Name)
|
|
|
- })
|
|
|
- },
|
|
|
- func(indexedPet string, person Person) string {
|
|
|
- return fmt.Sprintf("Pet: %s, Owner: %s", indexedPet, person.Name)
|
|
|
- },
|
|
|
- ).
|
|
|
- ToSlice(&results)
|
|
|
-
|
|
|
- for _, result := range results {
|
|
|
- fmt.Println(result)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Pet: 0 - Daisy, Owner: Hedlund, Magnus
|
|
|
- // Pet: 1 - Barley, Owner: Adams, Terry
|
|
|
- // Pet: 1 - Boots, Owner: Adams, Terry
|
|
|
- // Pet: 2 - Whiskers, Owner: Weiss, Charlotte
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//The following code example demonstrates how to use SingleWithT
|
|
|
-// to select the only element of a slice that satisfies a condition.
|
|
|
-func ExampleQuery_SingleWithT() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- fruit := From(fruits).
|
|
|
- SingleWithT(
|
|
|
- func(f string) bool { return len(f) > 10 },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(fruit)
|
|
|
- // Output:
|
|
|
- // passionfruit
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SkipWhileT
|
|
|
-// to skip elements of an array as long as a condition is true.
|
|
|
-func ExampleQuery_SkipWhileT() {
|
|
|
- grades := []int{59, 82, 70, 56, 92, 98, 85}
|
|
|
- var lowerGrades []int
|
|
|
- From(grades).
|
|
|
- OrderByDescendingT(
|
|
|
- func(g int) int { return g },
|
|
|
- ).
|
|
|
- SkipWhileT(
|
|
|
- func(g int) bool { return g >= 80 },
|
|
|
- ).
|
|
|
- ToSlice(&lowerGrades)
|
|
|
-
|
|
|
- //"All grades below 80:
|
|
|
- fmt.Println(lowerGrades)
|
|
|
- // Output:
|
|
|
- // [70 59 56]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SkipWhileIndexedT
|
|
|
-// to skip elements of an array as long as a condition that depends
|
|
|
-// on the element's index is true.
|
|
|
-func ExampleQuery_SkipWhileIndexedT() {
|
|
|
- amounts := []int{5000, 2500, 9000, 8000, 6500, 4000, 1500, 5500}
|
|
|
-
|
|
|
- var query []int
|
|
|
- From(amounts).
|
|
|
- SkipWhileIndexedT(
|
|
|
- func(index int, amount int) bool { return amount > index*1000 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [4000 1500 5500]
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use SortT
|
|
|
-// to order elements of an slice.
|
|
|
-func ExampleQuery_SortT() {
|
|
|
- type Pet struct {
|
|
|
- Name string
|
|
|
- Age int
|
|
|
- }
|
|
|
- // Create a list of pets.
|
|
|
- pets := []Pet{
|
|
|
- {Name: "Barley", Age: 8},
|
|
|
- {Name: "Boots", Age: 4},
|
|
|
- {Name: "Whiskers", Age: 1},
|
|
|
- {Name: "Daisy", Age: 4},
|
|
|
- }
|
|
|
-
|
|
|
- orderedPets := []Pet{}
|
|
|
- From(pets).
|
|
|
- SortT(
|
|
|
- func(pet1 Pet, pet2 Pet) bool { return pet1.Age < pet2.Age },
|
|
|
- ).
|
|
|
- ToSlice(&orderedPets)
|
|
|
-
|
|
|
- for _, pet := range orderedPets {
|
|
|
- fmt.Println(pet.Name, "-", pet.Age)
|
|
|
- }
|
|
|
- // Output:
|
|
|
- // Whiskers - 1
|
|
|
- // Boots - 4
|
|
|
- // Daisy - 4
|
|
|
- // Barley - 8
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use TakeWhileT
|
|
|
-// to return elements from the start of a slice.
|
|
|
-func ExampleQuery_TakeWhileT() {
|
|
|
- fruits := []string{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
|
|
|
-
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- TakeWhileT(
|
|
|
- func(fruit string) bool { return fruit != "orange" },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [apple banana mango]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use TakeWhileIndexedT
|
|
|
-// to return elements from the start of a slice as long asa condition
|
|
|
-// that uses the element's index is true.
|
|
|
-func ExampleQuery_TakeWhileIndexedT() {
|
|
|
-
|
|
|
- fruits := []string{"apple", "passionfruit", "banana", "mango",
|
|
|
- "orange", "blueberry", "grape", "strawberry"}
|
|
|
-
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- TakeWhileIndexedT(
|
|
|
- func(index int, fruit string) bool { return len(fruit) >= index },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [apple passionfruit banana mango orange blueberry]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use ToMapBy
|
|
|
-// by using a key and value selectors to populate a map.
|
|
|
-func ExampleQuery_ToMapByT() {
|
|
|
- type Product struct {
|
|
|
- Name string
|
|
|
- Code int
|
|
|
- }
|
|
|
-
|
|
|
- products := []Product{
|
|
|
- {Name: "orange", Code: 4},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- {Name: "lemon", Code: 12},
|
|
|
- {Name: "apple", Code: 9},
|
|
|
- }
|
|
|
-
|
|
|
- map1 := map[int]string{}
|
|
|
- From(products).
|
|
|
- ToMapByT(&map1,
|
|
|
- func(item Product) int { return item.Code },
|
|
|
- func(item Product) string { return item.Name },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(map1[4])
|
|
|
- fmt.Println(map1[9])
|
|
|
- fmt.Println(map1[12])
|
|
|
- // Output:
|
|
|
- // orange
|
|
|
- // apple
|
|
|
- // lemon
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use WhereT
|
|
|
-// to filter a slices.
|
|
|
-func ExampleQuery_WhereT() {
|
|
|
- fruits := []string{"apple", "passionfruit", "banana", "mango",
|
|
|
- "orange", "blueberry", "grape", "strawberry"}
|
|
|
- var query []string
|
|
|
- From(fruits).
|
|
|
- WhereT(
|
|
|
- func(f string) bool { return len(f) > 6 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [passionfruit blueberry strawberry]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use WhereIndexedT
|
|
|
-// to filter a slice based on a predicate that involves the index of each element.
|
|
|
-func ExampleQuery_WhereIndexedT() {
|
|
|
- numbers := []int{0, 30, 20, 15, 90, 85, 40, 75}
|
|
|
-
|
|
|
- var query []int
|
|
|
- From(numbers).
|
|
|
- WhereIndexedT(
|
|
|
- func(index int, number int) bool { return number <= index*10 },
|
|
|
- ).
|
|
|
- ToSlice(&query)
|
|
|
-
|
|
|
- fmt.Println(query)
|
|
|
- // Output:
|
|
|
- // [0 20 15 40]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use the ZipT
|
|
|
-// method to merge two slices.
|
|
|
-func ExampleQuery_ZipT() {
|
|
|
- number := []int{1, 2, 3, 4, 5}
|
|
|
- words := []string{"one", "two", "three"}
|
|
|
-
|
|
|
- q := From(number).
|
|
|
- ZipT(From(words),
|
|
|
- func(a int, b string) []interface{} { return []interface{}{a, b} },
|
|
|
- )
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [[1 one] [2 two] [3 three]]
|
|
|
-}
|
|
|
-
|
|
|
-// The following code example demonstrates how to use the FromChannelT
|
|
|
-// to make a Query from typed channel.
|
|
|
-func ExampleFromChannelT() {
|
|
|
- ch := make(chan string, 3)
|
|
|
- ch <- "one"
|
|
|
- ch <- "two"
|
|
|
- ch <- "three"
|
|
|
- close(ch)
|
|
|
-
|
|
|
- q := FromChannelT(ch)
|
|
|
-
|
|
|
- fmt.Println(q.Results())
|
|
|
- // Output:
|
|
|
- // [one two three]
|
|
|
-}
|